4.9 验证组
在一些比较复杂的页面上,也许会有许多功能独立的控件组。在这种情况下,采用统一的验证方法显然是不合适的,我们更加希望能够按功能组进行分组验证。在ASP.NET中,可以使用验证组来实现这些需求。验证组可以将页面上的验证控件归为一组,然后对每个验证组执行验证,各个验证组相互独立,任何一个验证组的执行与同一页的其他验证组无关。
创建验证组很简单,只需要将要分组的所有控件的ValidationGroup属性设置为同一个名称即可创建验证组。名称可以是任何字符串,但必须要满足分组的所有控件名称完全相同。示例如代码清单4-12所示。
代码清单4-12 TestValidationGroup.aspx
<form id="form1"runat="server">
<asp:Panel ID="Panel1"
EnableTheming="true"
Width="300"
GroupingText="组1"
runat="server">
用户名:
<asp:TextBox ID="UserName"runat="Server">
</asp:TextBox>
<br/>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator1"
ControlToValidate="UserName"
ValidationGroup="UserNameGroup"
ErrorMessage="请输入用户名"
runat="Server">
</asp:RequiredFieldValidator>
<br/>
<asp:Button ID="Button1"
Text="数据提交1"
CausesValidation="true"
ValidationGroup="UserNameGroup"
runat="Server"/>
</asp:Panel>
<asp:Panel ID="Panel2"
EnableTheming="true"
Width="300"
GroupingText="组2"
runat="server">
地址:
<asp:TextBox ID="Address"runat="Server">
</asp:TextBox>
<br/>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator2"
ControlToValidate="Address"
ValidationGroup="AddressGroup"
ErrorMessage="请输入地址"
runat="Server">
</asp:RequiredFieldValidator>
<br/>
<asp:Button ID="Button2"
Text="数据提交2"
CausesValidation="true"
ValidationGroup="AddressGroup"
runat="Server"/>
</asp:Panel>
</form>
在代码清单4-12中,分别设置了两个验证组。第一个验证组放在Panel1控件中,用于验证UserName文本框的内容是否为空;第二个验证组放在Panel2控件中,用于验证Address文本框的内容是否为空。编译上面的代码,运行结果如图4-16所示。
图 4-16 TestValidationGroup.aspx运行结果
在图4-16中,组1和组2是两个完全不同的验证组,当单击组1里面的“数据提交1”按钮时,因为Required FieldValidator1验证控件和Button1按钮的ValidationGroup属性名字同为UserName Group,它们是一个验证组。所以它只执行UserName文本框的验证,并不影响组2里面的Address文本框的验证。这是因为在回发过程中,只根据当前验证组中的验证控件来设置Page类的IsValid属性。当前验证组是由导致验证发生的控件确定的,即当单击组1的Button1按钮控件,其ValidationGroup属性设置为UserNameGroup的所有验证控件都有效,则IsValid属性将返回true。也因为这个原理,当单击组2里面的“数据提交2”按钮时,只会触发Address文本框的验证,同样也不会影响组1里面的UserName文本框的验证。
值得注意的是,对于其他控件(如DropDownList控件),如果控件的CausesValidation属性设置为true,并且AutoPostBack属性也设置为true,则同样可以触发验证。
除了通过上面的方式控制验证组之外,也可以通过后台代码编程的方式来控制验证组。若要以编程方式进行验证,可以调用Validate方法重载,使其采用ValidationGroup参数来强制只为该验证组进行验证。如强制验证上面示例的组1:
Page.Validate("UserNameGroup");
注意,在调用Validate方法时,IsValid属性反映到目前为止已验证的所有组的有效性。这可能包括作为回发结果验证的组以及以编程方式验证的组。如果任一组中的任何控件无效,则IsValid属性返回false。