在1.1中没有一中比较好的方法可以讲各个验证控件组合在一起,以便页面的一个部分上的验证程序可以重写该页面其他部分的验证程序,并且无论其他验证程序的状态如何,都可以使回发发生。
该问题由AalidationGroups1.aspx阐明,它包含在您可以针对本文下载的示例中。页面设计者预计用户能够填写一组TextBox并回发到服务器,而不必同时填写另一组,但它并不按此方式工作。除非所有输入字段都被填充,否则验证程序将被抱怨不休
Asp.Net 2.0中的验证组功能一劳永逸地解决了该问题,现在,可以使用ValidatationGroup的属性来组合验证控件。可以用相同的方式,将按钮控件分配给组,并且当一个组中的所以验证程序都对输入感到满意是,他们才允许回发发生,当然,前提是回发是由验证同一组中的控件生成的。演示如下:
<body>
<form runat="server">
<h1>New Users</h1>
<table>
<tr>
<td>User Name</td>
<td><asp:TextBox ID="NewUserName" RunAt="server" /></td>
<td><asp:RequiredFieldValidator ValidationGroup="NewUsers"
ControlToValidate="NewUserName" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBox ID="NewPassword1" TextMode="Password"
RunAt="server" /></td>
<td><asp:RequiredFieldValidator ValidationGroup="NewUsers"
ControlToValidate="NewPassword1" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td>Retype Password</td>
<td><asp:TextBox ID="NewPassword2" TextMode="Password"
RunAt="server" /></td>
<td><asp:RequiredFieldValidator ValidationGroup="NewUsers"
ControlToValidate="NewPassword2" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td>E-Mail Address</td>
<td><asp:TextBox ID="NewEMail" RunAt="server" /></td>
<td><asp:RequiredFieldValidator ValidationGroup="NewUsers"
ControlToValidate="NewEMail" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td></td>
<td><asp:Button ValidationGroup="NewUsers"
Text="Create Account" OnClick="OnCreateAccount"
RunAt="server" /></td>
<td></td>
</tr>
</table>
<hr>
<h1>Existing Users</h1>
<table>
<tr>
<td>User Name</td>
<td><asp:TextBox ID="UserName" RunAt="server" /></td>
<td><asp:RequiredFieldValidator
ValidationGroup="ExistingUsers"
ControlToValidate="UserName" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBox ID="Password" TextMode="Password"
RunAt="server" /></td>
<td><asp:RequiredFieldValidator
ValidationGroup="ExistingUsers"
ControlToValidate="Password" ErrorMessage="Required"
RunAt="server" /></td>
</tr>
<tr>
<td></td>
<td><asp:Button ValidationGroup="ExistingUsers"
Text="Log In" OnClick="OnLogIn" RunAt="server" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
<script language="C#" runat="server">
void OnCreateAccount (Object sender, EventArgs e) {}
void OnLogIn (Object sender, EventArgs e) {}
</script>
在CSDN上论坛上看到过这样的说法:ASP.NET的客户端验证不安全。然而实际上验证控件是在服务器端验证的,不管客户端是否发生了验证。而像Firefox这样的浏览器更是所有的验证都是在服务器上执行的。
因为1.x版本的验证控件是用HTML自定义属性来实现的,而除IE及IE内核的浏览器外,这些特性是不被支持的,因此,在验证其它浏览器的数据时无论如何都只能返回服务器了。在2.0中,这个特性终于被修改了,虽然看起来有点傻傻的。是的,它确实像我们普通会javascript的人都会想到的一样,使用javascript为验证控件生成的span元素增加属性。但是,这么简单的改动却使得可以使用客户端验证的浏览器大大增加了(基本上都可以了)。
而通过Page的属性ClientTarget可以设置所有的验证控件是否会在客户端验证。只要将这个属性设置为UpLevel就可以了,DownLevel下,所有的验证都只会在服务器上执行了。默认情况下,大多数浏览器都是会在客户端验证的,所以我并不知道它的这个属性是不是默认UpLevel了。当然,如果要为单独的一个或几个验证控件设置的话,那么还是使用原先的EnableClientScript。
另外还增加了一个SetFoucsOnError属性。就是当出错的时候将焦点移到控件上。这样就不会使用户在点击了按钮之后因为没看到错误提示而在那发愣了。另外一个小东西就是CustomValidator增加了ValidateEmptyText属性来让用户自定义验证控件在值为空时也验证。
下一个有用的特性是ValidationGroup属性,将你在一个按钮点击时要验证的控件设置为同一个组名吧,而另一个按钮要验证的设置为另一个名,这样就可以使点击一个按键时只发生期望的验证,而不是所有的验证,而不必在服务器端显示来控件。注意,按钮也应该设计ValidationGroup属性。