2011-08-01 56 views
2

我在頁面上添加了幾個ASP Text Box控件,添加了自定義驗證器。我有保存按鈕,驗證這些文本框。我剛剛添加了與文本框相同的驗證組。從按鈕上的驗證控件觸發onclientclick和客戶端驗證客戶端點擊

爲了納入addtional要求,我添加了onClientClick函數保存按鈕。但有趣的是,發現由於驗證組(驗證控件)的驗證不會觸發,而是調用onClientClick函數並調用服務器端Click事件。

JavaScript代碼

function ValidateInputs(source, args) { 
      var regex = /^(-{0,1}\d{1,100})$/; 
      if (args.Value.length < 1) { 
       $("span[id$='spn_error']").html('Please Enter ' + $(source).attr("errormessage")); 
       $("span[id$='spn_error']").show(); 
       args.IsValid = false; 
       return; 
      } 
      else if (!regex.test(args.Value)) { 
       $("span[id$='spn_error']").html($(source).attr("errormessage") + ' allows only numbers'); 
       $("span[id$='spn_error']").show(); 
       args.IsValid = false; 
       return; 
      } 
      else { 
       if ($("span[id$='spn_error']").html().indexOf($(source).attr("errormessage")) >= 0) 
        $("span[id$='spn_error']").hide(); 
       args.IsValid = true; 
       return; 
      } 
     } 

function isValidTracker() { 
//Dummy Code Say Confirm button 
return(confirm('Are you sure');) 

} 

HTML代碼

<span class="errormesg" runat="server" id="spn_error" style="display: none; 
         font-size: 9px;"></span> 
<asp:TextBox ID="txtLastMonthCount" runat="server" CssClass="inputbox" Width="75px" autocomplete="off" onkeypress="return isNumberKey(event);" ValidationGroup="g1"></asp:TextBox> 

<asp:CustomValidator ID="CVLastMonthCount" runat="server" ErrorMessage="Last Months Closing Count" Text="<img src='../images/alert.gif' alt='Please Enter Last Months Closing Count' title='Please Enter Last Months Closing Count' />" 
    ValidationGroup="g1" ClientValidationFunction="ValidateInputs" OnServerValidate="ValidateInputs" ControlToValidate="txtLastMonthCount" ValidateEmptyText="true"></asp:CustomValidator> 

<asp:Button ID="btnSave" runat="server" Text="Save" CssClass="button" ValidationGroup="g1" OnClientClick="return isValidTracker();" OnClick="btnSave_Click" /> 

請幫我找到保存按鈕點擊的解決火的OnClientClick和驗證控制。

回答

7

變化的OnClientClick從return isValidTracker()if (!isValidTracker()) return false;

+0

當然,這是工作。能否請你解釋一下背後的原因,因爲沒有太大的變化。 – suryakiran

+0

+1並接受解決方案。謝謝。 – suryakiran

+0

我不確定,但猜測驗證控件附加自己的處理程序來單擊重新評估驗證組中所有驗證程序的按鈕事件。但是,由於您從內聯代碼返回布爾值,因此不涉及其他處理程序。 –

1

二分之一的解決方案工作,但我烤了最後檢查到您的驗證 - 「?你確定」這將確保你不會詢問用戶直到你知道他們的行動是有效的...

function ValidateInputs(source, args) { 
    var regex = /^(-{0,1}\d{1,100})$/; 
    if (args.Value.length < 1) {     
     $("span[id$='spn_error']").html('Please Enter ' + $(source).attr("errormessage")); 
     $("span[id$='spn_error']").show();     
     args.IsValid = false;     
    }    
    else if (!regex.test(args.Value)) {     
     $("span[id$='spn_error']").html($(source).attr("errormessage") + ' allows only numbers');     
     $("span[id$='spn_error']").show();     
     args.IsValid = false;     
    } else {     
     if ($("span[id$='spn_error']").html().indexOf($(source).attr("errormessage")) >= 0)      
      $("span[id$='spn_error']").hide();     
     args.IsValid = true; 
    } 

    if (args.IsValid) args.IsValid = isValidTracker(); 
} 

雖然我會同意,一直在監督上的ASP.NET團隊的一部分 - 你的實現看起來更加直觀,應該得到支持。

B

+0

假設我有多個文本框控件爲其調用相同的自定義驗證功能。在這種情況下,這個函數可能被多次調用,這不是一個理想的結果。 – suryakiran

+0

@suryakiran - 同意 - 這是一個完全不同的場景。如果你想爲不同的場景提供答案,請發佈不同的場景:)在這種情況下,如果你有一個沒有ControlToValidate屬性的自定義驗證器(因此假設你將爲該組中的所有控件使用該自定義驗證器)精細。 – Brian

+0

+1感謝您的解決方案 – suryakiran

2

感謝您提供的解決方案。我也在Google上找到了一個解決方案,想到分享它,因爲這對其他像我這樣的其他場景會有所幫助。

function isValidTracker() { 

    if (Page_IsValid) { 
     return(confirm('Are you sure');)//Dummy Code Say Confirm button 
    } 
    else 
    { 
     return false; 
    } 

    } 

其中Page_IsValid是由ASP.Net驗證控件設置的Java腳本變量。當所有驗證控件都被成功驗證時,它被設置爲true。謝謝:)

+0

您是否嘗試在所有文本框中填寫正確的值,然後按Tab鍵? –

+0

是的。我做了嘗試,它工作正常。上面的函數被調用僅保存按鈕 – suryakiran

+0

+1你的解決方案是 –

0

你好,我也面臨同樣的問題。 CausesValidation =「true」屬性解決了我的問題。

+0

你能否詳細說明更多 – Panther

+0

我有一個列表視圖內的下拉列表更優美的的OnClientClick,在下拉列表中選擇的值必須是列表視圖中的所有行的不同我寫這我呼籲保存按鈕的JavaScript函數也有這是必需的,爲必填字段校驗器使用和驗證在同一按鈕上其他控件。的 jyoti