海东的技术资料

  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理 ::
  205 随笔 :: 22 文章 :: 722 评论 :: 68 引用

        在1.1中没有一中比较好的方法可以讲各个验证控件组合在一起,以便页面的一个部分上的验证程序可以重写该页面其他部分的验证程序,并且无论其他验证程序的状态如何,都可以使回发发生。
         该问题由AalidationGroups1.aspx阐明,它包含在您可以针对本文下载的示例中。页面设计者预计用户能够填写一组TextBox并回发到服务器,而不必同时填写另一组,但它并不按此方式工作。除非所有输入字段都被填充,否则验证程序将被抱怨不休
       Asp.Net 2.0中的验证组功能一劳永逸地解决了该问题,现在,可以使用ValidatationGroup的属性来组合验证控件。可以用相同的方式,将按钮控件分配给组,并且当一个组中的所以验证程序都对输入感到满意是,他们才允许回发发生,当然,前提是回发是由验证同一组中的控件生成的。演示如下:

<html>
  
<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属性。

posted on 2005-10-27 21:33 高海东 阅读(2630) 评论(5)  编辑 收藏 网摘 所属分类: ASP.NET 2.0

评论

#1楼 2005-10-29 21:35       
不错,就是错别字太多了。“回发”是不是PostBack呀?还是第一次看到这么翻译的。
  回复  引用  查看    

#2楼 2006-01-06 10:48 amanda[未注册用户]
为何自定义的验证控件在vs.net 2005下面不能fire 客户端事件呢?
  回复  引用    

何必呢?何苦呢?

一直思考微软搞出来服务器端控件真正的价值,最后得出结论,为了让大家快速上手,把老百姓当傻子,结果高级开发中,不伦不类。

我努力抛弃了服务器端控件模式,除了极少地方。页面响应速度大大增强。

另外,记住,扔掉<form runat="server">。

  回复  引用    

#4楼 2006-05-16 10:17 dearhuda[未注册用户]
@Dotnet41232323232

同意!

  回复  引用    

@Dotnet41232323232
话说得太绝对了。在可以接受的运行性能损失代价下,换来开发效率的大幅提高,我觉得还是划得来的。很多时候,性能瓶颈并不在服务控件上,而是在后台的处理以及设计缺陷上。

  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 263421




相关文章:

相关链接: