2011-02-25 70 views
26

我有一個驗證texbox的驗證器和自定義驗證器。所需的字段驗證器完美啓動。我無法讓自定義驗證器正確觸發?背後asp.net自定義驗證器未觸發文本框

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e) 
    { 
     Response.Write("firing - test"); 
     Response.End(); 


     if (e.Value.Length == 8) 
      e.IsValid = true; 
     else 
      e.IsValid = false; 
    } 
+0

我總是有服務器端驗證器的問題,我總是最終與客戶端:( – jonezy

+0

我也很想知道這個答案 – jonezy

+0

該方法是否解僱?是否將它設置爲驗證器的OnServerValidate事件?你能告訴我們驗證器的ASPX標記嗎? –

回答

1

問題

<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br /> 

<asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" /> 

<asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" /> 

代碼是你打電話Response.End()這有效地阻止了網頁的所有執行。因此,if/else塊根本沒有運行。在調試過程中註釋掉或忽略它,驗證器將按預期觸發。

我建議你使用調試器而不是以這種方式寫出迴應,或者如果你選擇使用它,請注意Response.End()的後果。

+0

是的,我聽到你,但我只是想確保處理程序被擊中它不是。 –

+0

@Eric你有沒有嘗試過對那些'Response'行進行註釋並運行它?我這樣做對我來說工作得很好。 –

+0

@Eric:我原以爲這也是問題。你說這種方法沒有解僱。你有沒有在這條線之前設置一個斷點並通過驗證? –

0

據我所知,如果您的文本框爲空,自定義驗證器不會觸發。

+4

'CustomValidator'可以觸發空文本,如果' ValidateEmptyText'屬性設置爲'true',正如我在回答中所述。這也應該刪除他對'RequiredFieldValidator'的需求。 – Kelsey

+0

+1凱爾西:你說得對,我不知何故錯過了那個屬性。 – Andrey

48

檢查您是否已將您的CustomValidator屬性ValidateEmptyText設置爲true,以便驗證空白文本。那麼你將不再需要RequiredFieldValidator了。

編輯:我把你的代碼和複製並粘貼到一個空的項目,並按預期工作。必須有你沒有發佈的東西,或者發佈錯誤,我們不知道。是否還有其他影響觸發驗證或驗證控件本身的按鈕?

編輯:這裏是確切的代碼(它在內容頁):

aspx頁面:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <asp:TextBox ID="txtPRI" runat="server" Width="295" /><br /> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" /> 
    <asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" errormessage="The text must be exactly 8 characters long!" /> 
</asp:Content> 

的.cs頁(空Page_Load):

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e) 
{ 
    // put a break point here and it stops on it 
    if (e.Value.Length == 8) 
     e.IsValid = true; 
    else 
     e.IsValid = false; 
} 
+1

Downvote ???小心解釋爲什麼? – Kelsey

+0

真的呃,所以我的代碼中的東西干擾事件的發射..我有一堆必要的字段驗證器,其他文本框,這就是全部。他們都適當地開火? –

+1

@Eric Savard你可以做一個簡單的測試,只需將你發佈的代碼複製並粘貼到一個空白項目中。它工作正常。你需要找出導致它的原因,所以我會先儘可能多地評論代碼,然後讓它起作用,然後慢慢加回來找出哪個代碼段導致問題。 – Kelsey

17

好吧...真的很老的問題,但沒有接受答案,我剛剛遇到了同樣的問題。

所以我打算用自定義服務器驗證有拋出這樣出去別人誰可能有這個問題,需要一個答案......

如果your're定期做驗證,沿,自定義服務器至少,所有其他驗證都會變回原狀,驗證只會觸發,這就是我爲之工作的方式。

+1

謝謝,這是我的原因 –

+1

舊的帖子,但謝謝你的反饋。這回答了我的問題:) – japesu

3

除了上述建議,我發現,在.NET Framework的新版本,你必須明確地火在服務器上的validate()方法來獲取自定義的驗證程序

// validate page before allowing import to go through 
    Page.Validate(); 
    if (!Page.IsValid) 
     return; 
8

記住在CustomValidator上設置此屬性...

ValidateEmptyText="True" 
2

我也有這個問題。是的,所有其他驗證人必須在,CustomValidator火災之前通過

但是,如果不爲你工作,那麼你可能需要強制使用Page.Validate()您的具體驗證組的驗證。

這就是我做的,我仍然設法保留我的RequiredFieldValidator並且不需要ValidateEmptyText="true"

在文本框中添加一個陷阱來強制驗證。

<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox> 

請注意,我用的是特定ValidationGroup「VG2」,因爲我有,我不想要驗證其他領域。

另外,我想驗證日期&時間

你需要兩件事。該TextBoxChanged_DateTimeTest方法...

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e) 
    { 
     Page.Validate("vg2"); 
     if (!Page.IsValid) 
     { 
      TextBox tb1 = (TextBox)sender; 
      IFormatProvider culture = new CultureInfo("en-AU", true); 

      //if page is not valid, then validate the date here and default it to today's date & time, 
      String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" }; 
      DateTime dt1; 
      DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1); 
      if (dt1.ToShortDateString() != "1/01/0001") 
       tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString(); 
      else 
       tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); 
     } 
    } 

而且你還需要爲CustomValidator服務器端驗證。在我的情況下,文本框必須接受日期&時間!

因此,這裏的標記......

<asp:CustomValidator ID="CustomValidator3" runat="server" ControlToValidate="txtLeft" ErrorMessage="Invalid date & time format (dd/MM/yyyy HH:mm)" 
            SetFocusOnError="true" ValidationGroup="vg2" OnServerValidate="CustomValidator_DateTime"></asp:CustomValidator> 

而這裏的後面的代碼...

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e) 
{ 
    Page.Validate("vg2"); 
    if (!Page.IsValid) 
    { 
     TextBox tb1 = (TextBox)sender; 
     IFormatProvider culture = new CultureInfo("en-AU", true); 

     //if page is not valid, then validate the date here and default it to today's date & time, 
     String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" }; 
     DateTime dt1; 
     DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1); 
     if (dt1.ToShortDateString() != "1/01/0001") 
      tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString(); 
     else 
      tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); 
    } 
} 

祝你好運!