在开发Web应用程序时,表单控件的验证是确保用户输入有效数据的关键步骤。.NET框架提供了一系列的验证器控件,如RequiredFieldValidator,这些控件对于开发者来说非常有帮助,即使是对JavaScript了解不多的新手开发者。然而,.NET框架并没有为所有控件提供内置的验证器,例如CheckBox和CheckBoxList等。本文将介绍如何开发自定义的验证器控件,以验证任何.NET服务器控件,并实现自己的逻辑。
在编写Web表单,如反馈表单或注册表单时,可能需要使用CheckBoxList控件,以便用户可以从列表中选择多个项目。但是,.NET框架并没有提供相应的验证器。开发者要么需要编写冗长的JavaScript代码进行客户端验证,要么使用CustomValidator控件来同时在服务器和客户端进行验证。另一种选择是使用Ajax Update Panels控件进行页面的部分渲染以实现验证,但这种方法繁琐且耗时,且完全依赖于主机和网络。
为了被验证器引用,控件必须具有验证属性。所有可以被验证的控件都有一个ValidationPropertyAttribute,它指示用于验证目的的属性。如果编写自己的控件,并希望它参与验证,可以通过提供这些属性之一来指定要使用的属性。
.NET中的每个验证器都是从BaseValidator基类派生的。因此,在编写任何验证器时,应该从BaseValidator派生自己的组件,以继承验证器控件的所有默认特性。
public class RequiredFieldValidatorForCheckBoxList : BaseValidator
{
// ...
}
接下来,需要重写ControlPropertiesValid()函数,以实现自己的逻辑来验证要验证的控件。
protected override bool ControlPropertiesValid()
{
// ...
}
然后,通过重写EvaluateIsValid()函数来实现验证或使控件无效的逻辑。
protected override bool EvaluateIsValid()
{
// ...
}
接下来,实现控件的OnLoad事件,以便在控件无效或选择不当时抛出异常。
protected override void OnLoad(EventArgs e)
{
// ...
}
接下来,通过添加一个属性到表示要验证的控件的字符串属性中,来实现在设计时列出控件。
[TypeConverter(typeof(ValidatedControlConverter))]
public string ControlToValidate
{
get
{
// ...
}
set
{
// ...
}
}
最后一步是实现JavaScript,以启用客户端验证。为此,需要创建一个StringBuilder对象,并在OnPreRender函数中编写完整的JavaScript函数,以在浏览器中验证控件。
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if ((ControlPropertiesValid()) && (this.EnableClientScript))
{
InjectClientValidationScript();
}
if (this.ErrorMessage.Trim().Length == 0)
{
this.ErrorMessage = this.ID;
}
}
代码中InjectClientValidationScript()函数用于生成客户端JavaScript验证函数。
private void InjectClientValidationScript()
{
StringBuilder sb_Script = new StringBuilder();
// ...
}
由于组件是从BaseValidator类派生的,新控件将继承父类的所有默认行为,而无需任何努力。只需要小心实现逻辑以使其工作。已经开发了一个控件(准备使用),用于验证CheckBoxList控件。该控件的工作方式与Microsoft的其他必填字段验证器控件完全相似。它具有内置功能,可以指定需要勾选多少个复选框才能成功验证。默认值为1,表示只需勾选一个复选框即可成功验证控件,而零表示需要勾选列表中的所有项目才能成功验证。