2009-10-13 24 views
21

ASP.NET 2.0. Cho phép nói rằng tôi có hai nhóm xác nhận valGrpOne và valGrpTwo; và hai Bản tóm tắt Xác thực valSummOne và valSummTwo; Lý do phá vỡ các phần là hoàn toàn thẩm mỹ. Một nút gửi kích hoạt xác thực trên cả hai nhóm.Page_ClientValidate() với nhiều ValidationGroups - làm thế nào để hiển thị nhiều bản tóm tắt cùng một lúc?

Bây giờ tôi muốn kích hoạt xác thực phía Máy khách, và muốn BOTH tóm tắt xác thực để hiển thị cùng một lúc;

Vì vậy, tôi thiết lập chức năng Javascript được gọi khi btnSubmit và bên trong chức năng này tôi gọi Page_ClientValidate("valGrpOne")Page_ClientValidate("valGrpTwo") liên tiếp; Vấn đề chỉ là một bản tóm tắt hiển thị tại một thời điểm (Nhưng tôi thực sự muốn cả hai hiển thị!)

Bất kỳ ý tưởng nào về cách nhận cả tóm tắt xác thực để hiển thị đồng thời, từ mã phía máy khách?

Rất giống với câu hỏi sau, câu trả lời cho phía máy chủ. Triggering multiple validation groups with a single button?

+0

Tôi không thể trả lời câu hỏi này vì tôi chưa thử. Nhưng các trình duyệt tính hợp lệ có thể được kích hoạt/quản lý ở phía máy khách. Hãy thử đọc http://msdn.microsoft.com/en-us/library/aa479045.aspx này mặc dù ngày 2002, nó đã giúp tôi với vấn đề xác nhận của tôi gần đây. –

+0

ok, cảm ơn cho liên kết msdn, như bạn đã nói nó là ngày nhưng tiếng ồn nền tốt (thông tin), đã giúp tôi trên đường đến một câu trả lời. – joedotnot

+0

tôi có điều kiện tương tự vấn đề của tôi là tóm tắt xác nhận cuộc gọi hai lần nếu cả hai nhóm không thành công. –

Trả lời

29

Ok, vì vậy câu trả lời không đơn giản. Dường như hành vi mặc định của xác thực phía máy khách là chỉ hiển thị nhóm/tóm tắt mới nhất vừa được xác thực. Nhưng một chút Javascript tweeking đã cho tôi một câu trả lời chấp nhận được.

Vui lòng cung cấp các cải tiến.

<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

đây là một câu trả lời tuyệt vời. đã giúp tôi giải quyết vấn đề tôi không gặp vấn đề gì. cảm ơn Niall – Somedeveloper

3

Không kiểm tra đầy đủ:

/* 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

Điều này đã giúp tôi với một số vấn đề khác :) – nima

0

đây là một phần mở rộng của mã hữu ích joedotnot của. Nó có lẽ là overkill cho đa số người dùng asp.net, nhưng điều này đã giúp với một dự án mà các kết hợp khác nhau của các nhóm xác nhận đã được áp dụng khi gửi, tùy thuộc vào các nút đã được chọn.

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; 
    } 

sau đó trong xử lý sự kiện khác nhau:

//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

Ở đây nó là để giữ cho nó đơn giản, một ví dụ rất đơn giản:

Có dưới javascript phương pháp trong Tiêu đề trang của bạn: -

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

modalPopupExtenderValidations là ID của cửa sổ bật lên phương thức. vgValidations là ID của Nhóm xác thực.

Bây giờ, trong phương pháp sắp xếp trước trang thêm thuộc tính onclick vào nút mà bạn muốn xác thực sẽ xảy ra.

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

Tôi hy vọng nó dễ hiểu.

Tạm biệt.

+0

Điều này dường như không liên quan đến câu hỏi. Cụ thể, điều này không giải quyết được vấn đề hiển thị tóm tắt cho nhiều nhóm xác thực trên một trang. –

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

Đây là một phương pháp đơn giản và chung chung khác để xác thực đối với nhiều nhóm.

// 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

Đây là câu trả lời tốt hơn, tổng quát hơn nhiều. Cảm ơn @Colin. Có một vấn đề nhỏ với nó, nhưng tôi sẽ chỉnh sửa nó với một hiệu chỉnh để làm cho nó hoạt động ... – theyetiman

Các vấn đề liên quan