2011-04-04 29 views
1

我在我的網站中使用了一些典型的ASP.NET驗證控件。現在我試圖在我的瀏覽器中禁用JavaScript來測試我的應用程序,當然Validation Controls不再有效。我認爲這是最好的嘗試讓他們使用建議的解決方案下的一個位置,而不是再投資輪工作,並建立了頁面或驗證層我的對象-Am我想正確的 - ?如何在ASP.NET中禁用JavaScript時處理驗證

你這是什麼想到這些選項,原因是:

  1. 包括在按下按鈕的事件代碼檢查,如果該頁面是有效的,如果沒有顯式調用Page.Validate();方法

  2. 檢查是否啓用JavaScript,如果我不應該打電話給Page.Validate();

如果您有更好的方法可以做,請告訴我。

回答

1

驗證控件旨在驗證服務器端的主要是。客戶端驗證是可選的(請參閱EnableClientScript屬性)。所以,如果它們不被停用JavaScript的工作,那麼你很可能缺少在您的網頁,一點點樣板代碼,如本段從the MSDN documentation on Page.IsValid

private void ValidateBtn_Click(Object Sender, EventArgs E) 
{ 
    Page.Validate(); 
    if (Page.IsValid == true) // yes, it is written this way in the MSDN documentation 
     lblOutput.Text = "Page is Valid!"; 
    else 
     lblOutput.Text = "Some required fields are empty."; 
} 

您也可以撥打Page.Validate並在頁面的檢查Page.IsValidOnLoad事件,以便您可以防止表單需要重新提交時進行下一步的回發。您可能甚至不需要明確地致電Validate()Button.CausesValidation默認爲true。

+0

@harpo ..此代碼看起來不錯,在onload尖太好了。但是這僅僅是一種罕見的情況(有一個JS禁用的瀏覽器)..所以,無論如何調用validate方法是明智的,即使啓用了JS,也失去了即時反饋的客戶端功能,增強了用戶體驗和還保存到服務器的旅程 – lKashef 2011-04-04 04:17:06

+0

通過正確處理服務器端的頁面,您不會失去客戶端行爲。事實上,如果客戶端驗證正在完成它的工作,那麼這個代碼永遠不會被首先調用(因爲不會發生回發)。 – harpo 2011-04-04 04:20:27

+0

通過「正確處理服務器端的頁面」,你是什麼意思? ..因爲從你的代碼我認爲,即使JS被啓用,它驗證了所有的控件,一切都很好,ButtonClick將再次嘗試驗證頁面,並檢查它是否有效..我很抱歉,也許我錯了但你能爲我分手嗎? – lKashef 2011-04-04 04:26:37

3

Javascript表單驗證純粹是爲了用戶的方便。這阻止了他們提交一個無效的電話號碼或任何形式的表格。

收到所有請求時,實際上應在服務器上驗證所有輸入。這裏是理想的流量,你會看到,沒有啓用JavaScript的瀏覽器也沒什麼大不了的:

browser -> javascript validation (optional) -> server validation (if this fails, go back to initial page with errors)

所以,即使他們沒有JS,該網頁還提交了數據,那麼你就可以返回來自服務器的錯誤。這通常是一種較差的用戶體驗(整頁重新加載,除非重新填寫表單,否則可能會重新輸入輸入內容),這就是爲什麼JS經常包含在驗證方案中的原因。

+0

亞歷克斯是對的,我們應該總是使用服務器端驗證。客戶端驗證可以通過一些技巧繞過,但服務器端驗證應始終存在。最好的方法是使用兩者。 – Abhi 2011-04-04 03:55:33

+0

我知道這沒什麼大不了的,在任何PC上發生這種情況的可能性都很低..但我試圖保存多次到服務器的行程。 「(如果失敗了,返回到錯誤的初始頁面)」這是我需要知道如何做到的一點,也許有些代碼 – lKashef 2011-04-04 03:56:05

+0

而且沒有必要提及服務器驗證的重要性。這就是爲什麼我想要以確保如果客戶端失敗,服務器端將返回 – lKashef 2011-04-04 03:57:22

0

你需要做定製服務器端驗證... http://msdn.microsoft.com/en-us/library/aa479013.aspx(朝底部信息)

事情是這樣的:

<%@ Page Language="C#" %> 
<script runat="server"> 

     void Button1_Click(Object sender, EventArgs e) { 
     if (Page.IsValid) { 
      Label1.Text = "VALID ENTRY!"; 
     } 
     } 

     void ValidateNumber(object source, ServerValidateEventArgs args) 
     { 
     try 
     { 
      int num = int.Parse(args.Value); 
      args.IsValid = ((num%5) == 0); 
     } 
     catch(Exception ex) 
     { 
      args.IsValid = false; 
     } 
     } 

</script> 
<html> 
<head> 
</head> 
<body> 
    <form runat="server"> 
     <p> 
      Number: 
      <asp:TextBox id="TextBox1" 
      runat="server"></asp:TextBox> 

      <asp:CustomValidator id="CustomValidator1" 
      runat="server" ControlToValidate="TextBox1" 
      ErrorMessage="Number must be even" 
      OnServerValidate="ValidateNumber"></asp:CustomValidator> 
     </p> 
     <p> 
      <asp:Button id="Button1" onclick="Button1_Click" 
      runat="server" Text="Button"></asp:Button> 
     </p> 
     <p> 
      <asp:Label id="Label1" runat="server"></asp:Label> 
     </p> 
    </form> 
</body> 
</html> 
+0

。我很抱歉,爲什麼我會去做那件事?我得到了你的示例的功能,但我的意思是,這不是說我根本不使用客戶端驗證(JS)嗎? – lKashef 2011-04-04 04:20:32

+0

這是一個良好的編碼器在服務器端進行驗證的最佳實踐.....對於安全目的也更好。 – 2011-04-04 04:39:20

+1

我認爲這不是單純依靠客戶端驗證的最佳實踐! – lKashef 2011-04-04 04:52:37

相關問題