2012-07-31 101 views
0

這裏的處理:我構建了一個自定義驗證器,只應在文本框中輸入時觸發。當它觸發時,它應測試以查看框中的文本是否爲整數,否則將拒絕它。它不會開火,但我試圖找出原因。ASP.NET自定義驗證器沒有觸發

我把這個空白的部分C#類的主體:

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
    { 
     int num; 
     bool isNum = int.TryParse(arg.ToString(), out num); 

     if(arg.Value.Length>0){ 
      if (isNum) 
      { 
       arg.IsValid = true; 
      } 
      else 
      { 
       arg.IsValid = false; 
      } 
     } 
     else{ 
      arg.IsValid=true; 
     } 
    } 

驗證器的代碼如下:

<div class="adult"> 
      <label>Adults ($10)</label> 
      <asp:TextBox runat="server" ID="wAdultLunch" class="adultLunch" MaxLength="2" /> 
      <asp:CustomValidator ID="intValidate" ControlToValidate="wAdultLunch" ErrorMessage="Invalid number" OnServerValidate="intValidate_Validate" Display="Static" runat="server" EnableClientScript="False" ValidateEmptyText="True"></asp:CustomValidator> 
</div> 

洞察力,將不勝感激!

編輯:我在下面附

<asp:Button ID="wSubmit" runat="server" Text="Submit" OnClientClick="return validateForm();" causesvalidation="true"/> 
+0

您可以包含引起回發的對象的標記嗎?您在該對象上使用CausesValidation ='false'嗎?另外,在繼續之前,你是否在你的回發處理程序中檢查IsValid? – 2012-07-31 21:45:07

+0

我添加了該按鈕的回發代碼。我如何檢查回發處理程序中的IsValid,我覺得我沒有這樣做。 – ijb109 2012-08-01 13:04:11

+0

儘管它沒有直接回答你的問題,你有沒有考慮過使用''和'? – freefaller 2012-08-01 13:10:19

回答

2

您正在對錯誤的東西進行解析。 arg.ToString()會給你的"System.Web.UI.WebControls.ServerValidateEventArgs",字符串當你真正想要的arg.Value(這已經是一個字符串)

所以,與其...

bool isNum = int.TryParse(arg.ToString(), out num); 

其更改爲(注意.Value)。 ...

bool isNum = int.TryParse(arg.Value, out num); 

雖然它比實際需要複雜得多。整個事情可以更全面地改寫了很多這樣的...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
{ 
    int num; 
    arg.IsValid = int.TryParse(are.Value, out num); 
} 

這是因爲TryParse將返回true,如果轉換成功,否則爲false。

作爲最後的想法,所有這些都可以使用<asp:RequiredFieldValidator ...>,<asp:CompareValidator Operator="DataTypeCheck" Type="Integer" ...><asp:RangeValidator ...>驗證器控件來實現。


UPDATE

由於OP指出,他不希望錯誤時的文本框爲空時,這樣反而試試這個...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
{ 
    if (args.Value.Length > 0) 
    { 
     int num; 
     arg.IsValid = int.TryParse(are.Value, out num); 
    } 
    else 
    { 
     arg.IsValid = true; 
    } 
} 

而且具有已經被@HansKesting指出......如果所有的客戶端驗證都通過了,這將只會被調用。只要客戶端驗證失敗,表單提交回服務器也會被取消。

+0

這很有幫助。我試圖獲得參數長度的部分原因是,如果沒有值傳入,我希望它是有效的,但如果有參數,則它需要是一個數字。 – ijb109 2012-08-01 14:06:48

+0

啊,ok @ ijb109 - 這很有道理......在這種情況下,將解析**放在** if(args.Value.Length> 0)中''不要在空字符串上執行它 – freefaller 2012-08-01 14:09:07

+0

只爲了確定,這隻會在提交按鈕被點擊時激活,是否正確?在這種情況下,然後,客戶端驗證會使其無法驗證,因此爲了測試它,我必須將其關閉。 – ijb109 2012-08-01 14:30:41

0

回傳代碼,我假設你有一個服務器端的事件,如果驗證通過執行。例如: :按鈕點擊事件。 因爲如果您檢查Page.IsValid,那麼如果驗證通過,則Page.IsValid將爲true將爲false。 您需要使用Page.IsValid來檢查驗證是否通過。

0

在前端嘗試將CausesValidation屬性設置爲true,如下所示。看看是否有幫助。

<asp:Button ID="btnSubmit" Text="Submit" CausesValidation="true" runat="server" /> 
2

我不知道它是否相關,但我有一個自定義驗證器沒有解僱的問題。我讓它驗證了一個dropdownlist,它有一個空字符串的默認值。我必須設置

ValidateEmptyString="true" 

然後它開始工作就好了。

您也可以調用Validate()函數並從自定義驗證器控件讀取IsValid屬性。但是,頁面的驗證功能應該可以正常工作,並且不應該需要這樣的調用。