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所示。

figure_0151_0112

图 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。