2009-10-13 52 views
21

ASP.NET 2.0。比方說,我有兩個驗證組valGrpOne和valGrpTwo;和兩個驗證摘要valSummOne和valSummTwo;分割部分的理由純粹是美學的。一個提交按鈕觸發兩組驗證。Page_ClientValidate()與多個ValidationGroups - 如何同時顯示多個摘要?

現在我想觸發客戶端驗證,並希望兩個驗證摘要同時顯示;

所以我設置了一個Javascript函數,它在btnSubmit被調用,並且在這個函數裏我連續調用Page_ClientValidate("valGrpOne")Page_ClientValidate("valGrpTwo");問題是一次只顯示一個摘要(但我確實希望兩者都顯示!)

有關如何從客戶端代碼同時顯示驗證摘要的任何想法?

非常類似於以下問題,它爲服務器端提供答案。 Triggering multiple validation groups with a single button?

+0

我無法回答這個問題,因爲我還沒有嘗試過。但驗證器可以在客戶端觸發/管理。嘗試閱讀http://msdn.microsoft.com/en-us/library/aa479045.aspx(儘管日期爲2002年),它最近幫助我解決了驗證問題。 – 2009-10-13 15:12:51

+0

好的,謝謝你的msdn鏈接,因爲你說的是​​過時的,但是很好的背景噪音(信息),這幫助我找到答案。 – joedotnot 2009-10-14 01:53:21

+0

我有類似的情況,我的問題是驗證摘要調用兩次,如果兩組都失敗。 – 2012-09-17 13:01:53

回答

29

好的,所以答案並不簡單。看起來,客戶端驗證的默認行爲是僅顯示剛剛被驗證的最新組/摘要。但是一些Javascript的tweeking給了我一個可以接受的答案。

隨時提供改進。

<script type="text/javascript" language="javascript"> 
    /* Manual client-side validation of Validator Groups */ 
    function fnJSOnFormSubmit() { 
     var isGrpOneValid = Page_ClientValidate("valGrpOne"); 
     var isGrpTwoValid = Page_ClientValidate("valGrpTwo"); 

     var i; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     //display all summaries. 
     for (i = 0; i < Page_ValidationSummaries.length; i++) { 
      summary = Page_ValidationSummaries[i]; 
      //does this summary need to be displayed? 
      if (fnJSDisplaySummary(summary.validationGroup)) { 
       summary.style.display = ""; //"none"; "inline"; 
      } 
     } 

     if (isGrpOneValid && isGrpTwoValid) 
      return true; //postback only when BOTH validations pass. 
     else 
      return false; 
    } 


    /* determines if a Validation Summary for a given group needs to display */ 
    function fnJSDisplaySummary(valGrp) { 
     var rtnVal = false; 
     for (i = 0; i < Page_Validators.length; i++) { 
      if (Page_Validators[i].validationGroup == valGrp) { 
       if (!Page_Validators[i].isvalid) { //at least one is not valid. 
        rtnVal = true; 
        break; //exit for-loop, we are done. 
       } 
      } 
     } 
     return rtnVal; 
    } 
</script> 
+0

這是一個很好的答案。幫我解決了我沒有問題的問題。謝謝Niall – Somedeveloper 2011-02-25 16:33:04

3

完全測試:

/* Manual client-side validation of Validator Groups - Remix */ 
function PageValidate() { 
    var PageIsValid = true; 

    for (var validator in Page_Validators) { 
     ValidatorValidate(validator); 
     PageIsValid = PageIsValid && validator.isvalid; 
    } 

    if (PageIsValid) { 
     return true; //postback only when ALL validations pass. 
    } 
    else { 
     return false; 
    } 
} 

/* This also does something similar */ 
function PageValidate() { 
    return Page_ClientValidate(); 
} 
+0

這幫了我一些其他的問題:) – nima 2011-10-05 08:20:58

0

這是joedotnot的有用的代碼擴展。對於大多數asp.net用戶來說,這可能是矯枉過正的,但是這對於一個項目有所幫助,在這個項目中驗證組的不同組合必須應用於提交,具體取決於哪些按鈕已被選中。

var validationManager = function() { 
     // Manual client-side validation of Validator Groups 
     // an empty string('') is default - to validate controls without a validation group 
     var valGroups = [''], 
     returnObj = { //define methods 
      set: function (/*string argument list*/) { 
       valGroups = Array.prototype.slice.call(arguments); 
       return returnObj; 
      }, 
      add: function (/*string argument list*/) { 
       var i; 
       for (i = 0; i < arguments.length; i++) { 
        if (valGroups.indexOf(arguments[i]) === -1) { 
         valGroups.push(arguments[i]); 
        } 
       } 
       return returnObj; 
      }, 
      remove: function (/*string argument list*/) { 
       var i = 0, n = 0; 
       for (i = 0; i < arguments.length; i++) { 
        var n = valGroups.indexOf(arguments[i]); 
        if (n > -1) valGroups.splice(n, 1); 
       } 
       return returnObj; 
      }, 
      validate: function() { 
       var i = 0, 
        summariesToDisplay = []; 
       for (; i < valGroups.length; i++) { 
       if (!Page_ClientValidate(valGroups[i])) { //this will display the contents of the validator 
        summariesToDisplay.push(valGroups[i]); 
        } 
       } 
       if (!summariesToDisplay.length) { return true; } 
       for (i = 0; i < Page_ValidationSummaries.length; i++) { //make relevant summaries visible 
       if (summariesToDisplay.indexOf(Page_ValidationSummaries[i].validationGroup || '') > -1) { 
         Page_ValidationSummaries[i].style.display = "inline"; //"none"; "inline"; 
        } 
       } 
       return false; 
      } 
     }; 
     if (arguments.length > 0) { 
      returnObj.set.apply(null, arguments); 
     } 
     return returnObj; 
    } 

然後在不同的事件處理程序:

//set up a global object 
    var validateOnSubmit = validationManager('','BMIvalGrp'); 

    //within a radio click handler 
    validateOnSubmit.add('weightValGrp','ageValGrp') 
        .remove('BMIvalGrp'); 

    //added to submit button handlers 
    validateOnSubmit.validate(); 
0

這是保持它的簡單,一個很簡單的例子:

有以下的JavaScript網頁標題的方法: -

<script type="text/javascript" language="javascript"> 
function ShowModalDialog4Validations() { 
    var x = $find("modalPopupExtenderValidations"); 
    Page_ClientValidate("vgValidations"); 
    if (!Page_IsValid) 
     x.show(); 
} 

modalPopupExtenderValidations是模式彈出窗口的ID。 vgValidations是驗證組的ID。

現在,在頁面預渲染方法中,將onclick屬性添加到您希望進行驗證的按鈕上。

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     btnMyButton.Attributes.Add("onclick", "ShowModalDialog4Validations();"); 
    } 

我希望它容易理解。

再見。

+0

這似乎並沒有涉及到這個問題。具體來說,這並不能解決在頁面上顯示多個驗證組摘要的問題。 – 2012-07-02 21:21:29

0
<b>Lets Say here is u r link button</b> 
<asp:LinkButton ID="lnkbtnSubmit" runat="server" OnClientClick="return fnJSOnFormSubmit();" meta:resourcekey="lnkbtnSubmitResource1">Submit</asp:LinkButton> 
<b> And u r Script is</b> 
<script type="text/javascript"> 


    function confirmAction() { 
     var retVal = confirm("Are you sure want to continue ?"); 
     if (retVal == true) { 

      return true; 
     } 
     else { 

      return false; 
     } 
    } 

    function fnJSOnFormSubmit() { 
     var isGrpOneValid = Page_ClientValidate("updateuser"); 
     var isGrpTwoValid = Page_ClientValidate("BaseKey"); 

     var i; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     isGrpOneValid = Page_ClientValidate("updateuser"); 
     isGrpTwoValid = Page_ClientValidate("BaseKey"); 

     i =0; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     if (isGrpOneValid && isGrpTwoValid) 
      return true; //postback only when BOTH validations pass. 
     else 
      return false; 
    } 


    /* determines if a Validation Summary for a given group needs to display */ 
    function fnJSDisplaySummary(valGrp) { 
     var rtnVal = false; 
     for (i = 0; i < Page_Validators.length; i++) { 
      if (Page_Validators[i].validationGroup == valGrp) { 
       if (!Page_Validators[i].isvalid) { //at least one is not valid. 
        rtnVal = true; 
        break; //exit for-loop, we are done. 
       } 
      } 
     } 
     return rtnVal; 
    } 




</script> 
2

這是另一種簡單通用的方法,用於驗證多個組。

// Page_ClientValidate only shows errors from the last validation group. 
// This method allows showing for multiple groups 
function Page_ClientValidateMultiple(groups) { 
    var invalidIdxs = []; 
    var result = true; 

    // run validation from each group and remember failures 
    for (var g = 0; g < groups.length; g++) { 
     result = Page_ClientValidate(groups[g]) && result; 
     for (var v = 0; v < Page_Validators.length; v++) 
      if (!Page_Validators[v].isvalid) 
       invalidIdxs.push(v); 
    } 

    // re-show any failures 
    for (var i = 0; i < invalidIdxs.length; i++) { 
     ValidatorValidate(Page_Validators[invalidIdxs[i]]); 
    } 

    // return false if any of the groups failed 
    return result; 
}; 
+0

這是一個更好,更通用的答案。謝謝@Colin。這有一個小問題,但我會用一個修正來編輯它,使其工作... – theyetiman 2013-12-04 14:25:11