ASP.NET 2.0 驗證控件新的功能

        在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屬性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章