2009-10-13 16 views
21

ASP.NET 2.0. Powiedzmy, że mam dwie grupy walidacji: valGrpOne i valGrpTwo; i dwa podsumowania walidacji valSummOne i valSummTwo; Powód do rozbicia sekcji jest czysto estetyczny. Jeden przycisk przesyłania, który uruchamia walidację w obu grupach.Page_ClientValidate() z wieloma ValidationGroups - jak wyświetlać wiele podsumowań jednocześnie?

Teraz chcę wywołać sprawdzanie poprawności po stronie klienta, I chcę jednocześnie wyświetlić oba podsumowania sprawdzania poprawności;

Tak więc ustawiam funkcję JavaScript, która jest wywoływana po btnSubmit, a wewnątrz tej funkcji wywołuję kolejno Page_ClientValidate("valGrpOne") i Page_ClientValidate("valGrpTwo"); Problemem jest tylko jedno podsumowanie na raz (ale tak naprawdę chcę, aby oba zostały pokazane!).

Jakieś pomysły na to, jak uzyskać oba podsumowania sprawdzania poprawności do jednoczesnego wyświetlania z kodu po stronie klienta?

Bardzo podobne do następującego pytania, które odpowiadają po stronie serwera. Triggering multiple validation groups with a single button?

+0

Nie mogę odpowiedzieć na to pytanie, ponieważ tego nie próbowałem. Ale weryfikatory mogą być uruchamiane/zarządzane po stronie klienta. Spróbuj przeczytać ten http://msdn.microsoft.com/en-us/library/aa479045.aspx choć z roku 2002, pomógł mi ostatnio w moim problemie z walidacją. –

+0

ok, dziękuję za link msdn, jak powiedziałeś, że jest przestarzały, ale dobry szum tła (informacje), który pomógł mi w drodze do odpowiedzi. – joedotnot

+0

Mam podobny warunek, mój problem polega na tym, że podsumowanie sprawdzania poprawności wywołuje dwa razy, jeśli obie grupy zawiodą. –

Odpowiedz

29

OK, więc odpowiedź nie była prosta. Wygląda na to, że domyślnym zachowaniem walidacji po stronie klienta jest wyświetlenie tylko ostatniej zatwierdzonej grupy/podsumowania. Ale trochę korepetycji JavaScript dał mi akceptowalną odpowiedź.

Zapraszam do oferowania ulepszeń.

<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

to jest doskonała odpowiedź. pomógł mi rozwiązać problem, nie miałem problemu. dzięki Niall – Somedeveloper

3

Nie pełni przetestowane:

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

Pomogło mi to z innym problemem :) – nima

0

ten jest rozszerzeniem użytecznego kodu joedotnot użytkownika. Prawdopodobnie jest to przesadą dla większości użytkowników asp.net, ale pomogło to w projekcie, w którym różne kombinacje grup walidacyjnych musiały być stosowane przy przesyłaniu, w zależności od tego, które przyciski zostały wybrane.

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

następnie w różnych programów obsługi zdarzeń:

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

Oto ona zachować to prosty, bardzo prosty przykład:

Mają poniżej javascript metoda w nagłówku strony: -

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

modalPopupExtenderValidations jest identyfikatorem modalnego okna podręcznego. vgValidations jest identyfikatorem grupy walidacyjnej.

Teraz, w metodzie prerender strony dodaj atrybut onclick do przycisku, który ma zostać sprawdzony.

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

Mam nadzieję, że będzie to łatwe do zrozumienia.

Pa.

+0

Nie wydaje się, że dotyczy to pytania. W szczególności nie rozwiązuje to problemu z wyświetlaniem podsumowań dla wielu grup walidacji na stronie. –

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

Oto kolejna prosta i ogólna metoda sprawdzania poprawności wobec wielu grup.

+0

To znacznie lepsza, bardziej ogólna odpowiedź. Dzięki @Colin. Jest z tym niewielki problem, ale zamierzam go edytować z poprawką, aby działało ... – theyetiman

Powiązane problemy