自验证 ASP.NET 文本框

分享于 

10分钟阅读

Web开发

  繁體

介绍

随着. NET的丰富,我想要更多。 我希望 ASP.NET 中生成的web窗体控件已经生成了验证 --,并没有搞乱所有的验证控件 ! 你应该能够创建一个 IntegerTextBox 或者 MoneyTextBox 等等 并指定它不接受空白,或者在范围内有一个值 等等,它应该以正确的格式返回。 我甚至想在有问题的时候改变颜色。

所以我努力想知道怎么做这样你就不必。

实现IValidator接口

我深入分析了SDK文档,发现任何控件都可以是一个页面验证器,如果它实现了 IValidator 接口。下面是一个简单的示例,从 文本框


using System;


using System.Web.UI.WebControls;


using System.Web.UI;



namespace MyValidatingControls {


 public class TextBox : System.Web.UI.WebControls.TextBox, IValidator {


 private bool _valid = true;


 private string _errorMessage = "";



 public bool IsValid {


 get { return _valid; }


 set { _valid = value; }


 }



 public string ErrorMessage {


 get { return _errorMessage; }


 set { _errorMessage = value; }


 }



 public void Validate() {


 }


 }


}



当然,这不做任何事情,但是上面的代码满足基本 IValidator 合同( 例如,它会编译)。 如果有一个 private 字段,我创建了两个字段来保存状态和错误消息。 为了确保执行验证程序,我们必须将验证器添加到包含页面的页确认器列表。

我做了一个小的作业阅读 SDK,它提到验证器在初始化期间添加自己的列表。 IValidator 基本上是 register,所以我们重写 OnInitOnUnload 从页面添加和删除验证程序 确认器 列表。


protected override void OnInit(EventArgs e) {


 base.OnInit(e);


 Page.Validators.Add(this);


}



protected override void OnUnload(EventArgs e) {


 if (Page!= null) {


 Page.Validators.Remove(this);


 }


 base.OnUnload(e);


}



完成setup设置""

在我们编写验证器之前,我想要设置一些 helper 项,这些项将使事情更简洁。 我不想根据每一个验证问题提供错误信息。 我将根据它的预期的数据类型将它们编程到控件中。 因此,我需要向控件提供更多的信息,以便它能够正确地给出错误消息。

我将添加一个名为 FriendlyName 将在所有错误消息中使用,以引用这里控件。 因此,如果我们要求的控制有一个 RetailPrice 我们让我们 FriendlyName be 零售价 或者它在页面上标记的内容。


private string _friendlyName = "";



public string FriendlyName {


 get { return _friendlyName; }


 set { _friendlyName = value; }


}



最后,在我们写验证之前,我想更新 IsValid 如果控件无效,则将它的更改为浅红色。


public bool IsValid {


 get { return _valid; }


 set { 


 _valid = value; 


 if (!_valid) {


 this.BackColor = Color.LightCoral;


 } 


 else {


 this.BackColor = Color.White;


 }


 }


}



不允许空白

对于第一个验证,让它可选:文本字段不接受空格。 我们需要创建一个可以设置为"启用"的属性。


private bool _blankAllowed = true;



public bool AllowBlank {


 get { return _blankAllowed; }


 set { _blankAllowed = value; }


}



最后,我们可以编写 验证 函数并将它的放置在网页上。


public virtual void Validate() {


 this.IsValid = true;



 if (!this.AllowBlank) {


 bool isBlank = (this.Text.Trim() == "");



 if (isBlank) {


 this.ErrorMessage = 


 String.Format("'{0}' cannot be blank.", 


 this.FriendlyName);


 this.IsValid = false;


 }


 }


}



展开这个想法

现在我们有了一个基本的文本字段,用于构建验证,我们可以扩展这个想法,创建更有趣的文本。

关于这个想法的下一个简单的扩展是 IntegerTextBox 我想要我 IntegerTextBox 要设置有效值的范围,但仍然可以允许空格。 因此,像以前一样,我们添加所需的属性。

因为我们建立了基础 文本框 ,我们只需要从它派生并覆盖 验证 并添加新的属性,我们就可以。


private int _minValue = Int32.MinValue;


private int _maxValue = Int32.MaxValue;



public int MinValue {


 get { return _minValue; }


 set { 


 _minValue = value; 



 if (_minValue > _maxValue) {


 int swap = _minValue;


 _minValue = _maxValue;


 _maxValue = swap;


 }


 }


}



public int MaxValue {


 get { return _maxValue; }


 set { 


 _maxValue = value; 



 if (_minValue > _maxValue) {


 int swap = _minValue;


 _minValue = _maxValue;


 _maxValue = swap;


 }


 }


}



然后我们更新我们 验证 方法并添加本机值输出。


public override void Validate() {


 this.IsValid = true;



 bool isBlank = (this.Text.Trim() == "");



 if (isBlank) { 


 if (!AllowBlank) {


 this.ErrorMessage = String.Format("'{0}'" +


 "cannot be blank.", this.FriendlyName);


 this.IsValid = false;


 }


 } else {


 try {


 _value = Int32.Parse(this.Text);


 if (_value < this.MinValue) {


 this.ErrorMessage = String.Format("'{0}' cannot" +


 "be less than {1}", 


 this.FriendlyName, this.MinValue);


 this.IsValid = false;


 }



 if (_value > this.MaxValue) {


 this.ErrorMessage = String.Format("'{0}'" +


 "cannot be more than {1}", 


 this.FriendlyName, this.MinValue);


 this.IsValid = false;


 }


 } catch {


 this.ErrorMessage = String.Format("'{0}'" +


 "is not a valid integer.", this.FriendlyName);


 this.IsValid = false;


 }


 }


}



public int Value {


 get { return _value; }


 set { 


 _value = value;


 this.Text = _value.ToString();


 }


}



结束语

就是这样扩展这个类,你可以创建一个 ! DateTextBox 或者 CurrencyTextBox 我包括了一个示例使用页面,显示了它的工作效果。

在我们之前:


<asp:TextBox id="Number" runat="server"/>


<asp:RequiredFieldValidator id="RequiredFieldValidator2" 



   ControlToValidate="Number" 



   Text="'Number' cannot be blank." runat="server"/>


<asp:RangeValidator id="Range1" ControlToValidate="Number" 



   MinimumValue="0" MaximumValue="100" 



   Type="Integer" Text="The value must be from 0 to 100!" 



   runat="server"/>



现在我们有了:


<MyControls:IntegerText id="Number" 



    FriendlyName="Number" MinValue="0" MaxValue="100" 



    AllowBlank="false" runat="server">



注意,我的类远没有完成,也没有提供像现有验证控件那样的精确功能。 一个明确的改进是添加客户端脚本,以便所有验证都不会在服务器上发生。

但是,对于像我这样不使用 Visual Studio. NET的人来说,这可以节省大量的输入和设置属性。

我希望大家能看到一个例子,如果你在寻找同样的事情。 也许在未来我会感到灵灵,以向你展示我使用的完整类的完整集合。

历史记录

我注意到在SDK中添加验证器应该出现在 初始化 而不是 装载 因此,我更新了文本和代码示例。 我还添加了删除。


文本  asp  asp-net  TEX  BOX  SELF  
相关文章