2009-10-13 6 views
21

ASP.NET 2.0. Disons que j'ai deux groupes de validation valGrpOne et valGrpTwo; et deux résumés de validation valSummOne et valSummTwo; La raison de la rupture des sections est purement esthétique. Un bouton de soumission qui déclenche la validation sur les deux groupes.Page_ClientValidate() avec plusieurs ValidationGroups - comment afficher plusieurs résumés simultanément?

Maintenant, je veux déclencher la validation côté client, ET je veux que les deux résumés de validation s'affichent en même temps; Donc, je configure une fonction Javascript qui est appelée sur btnSubmit, et dans cette fonction j'appelle Page_ClientValidate("valGrpOne") et Page_ClientValidate("valGrpTwo") en succession; Le problème est seulement un résumé des spectacles à la fois (mais je veux vraiment les deux à montrer!)

Des idées sur la façon d'obtenir simultanément les deux récapitulatifs de validation, à partir du code client?

Très similaire à la question suivante, qui répond pour le côté serveur. Triggering multiple validation groups with a single button?

+0

Je ne peux pas répondre à cette question car je ne l'ai pas essayé. Mais les validateurs peuvent être déclenchés/gérés du côté client. Essayez de lire ceci http://msdn.microsoft.com/en-us/library/aa479045.aspx bien que daté de 2002, il m'a aidé avec mon problème de validation récemment. –

+0

ok, merci pour le lien msdn, comme vous l'avez dit c'est daté mais bon bruit de fond (info), qui m'a aidé sur le chemin de la réponse. – joedotnot

+0

J'ai une condition similaire mon problème est que le résumé de validation appelle deux fois si les deux groupes échouent. –

Répondre

29

Ok, donc la réponse n'était pas simple. Il semble que le comportement par défaut de la validation côté client est de montrer uniquement le dernier groupe/résumé qui vient d'être validé. Mais un peu de tweeking Javascript m'a donné une réponse acceptable.

N'hésitez pas à apporter des améliorations.

<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

c'est une excellente réponse. m'a aidé à résoudre le problème que je n'avais aucun problème. Merci Niall – Somedeveloper

3

Non entièrement testé:

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

Cela m'a aidé avec un autre problème :) – nima

0

c'est une extension du code utile de joedotnot. Il est probablement trop lourd pour la majorité des utilisateurs d'asp.net, mais cela a aidé avec un projet où différentes combinaisons de groupes de validation devaient être appliquées sur submit, en fonction des boutons qui avaient été sélectionnés.

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

puis dans les différents gestionnaires d'événements:

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

Ici, il est de le garder simple, un exemple très simple:

Demandez la méthode javascript ci-dessous dans votre tête: -

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

modalPopupExtenderValidations est l'ID de la fenêtre contextuelle modale. VgValidations est l'ID du groupe de validation.

Maintenant, dans la méthode prerender de page, ajoutez l'attribut onclick à votre bouton sur lequel vous voulez que la validation se produise.

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

J'espère que c'est facile à comprendre.

Salut.

+0

Cela ne semble pas se rapporter à la question. Plus précisément, cela ne résout pas le problème de montrer les résumés à plusieurs groupes de validation sur une page. –

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

Voici une autre méthode simple et générique pour la validation de plusieurs groupes.

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

Ceci est une meilleure réponse, plus générique. Merci @Colin. Il y a un léger problème, mais je vais l'éditer avec une correction pour le faire fonctionner ... – theyetiman

Questions connexes