2011-09-21 4 views
1

J'utilise Ajax.BeginForm pour ma page. La validation côté client effectue son travail et affiche les éventuelles erreurs dans la zone de résumé de validation. Maintenant, je veux le même comportement quand une erreur côté serveur se produit dans le contrôleur.Comment gérer les erreurs côté serveur dans MVC3 avec ajax.beginform

Dans un formulaire standard vous AddModelError au ModelState et revenir à la forme et le résumé des champs et la validation sont mis à jour. Mais avec Ajax, je ne peux pas faire fonctionner ça.

Mon contrôleur renvoie un résultat JsonResult (ce n'est peut-être pas la bonne façon, mais je peux facilement récupérer mes informations de mise à jour) et la première chose que je fais est de vérifier ModelState.IsValid. Si c'est faux, comment obtenez-vous ces erreurs à afficher sur la page dans le résumé de validation?

Je reviens une collection dictionnaire avec le nom du champ et l'erreur et appeler cette routine, ce qui est à peu près juste pris de jQuery:

function ShowFormErrors(validator, errors) 
{ 
if(errors) { 
    // add items to error list and map 
    $.extend(validator.errorMap, errors); 
    validator.errorList = []; 
    var curElement; 
    for (var name in errors) { 
     for(var elm=0; elm<validator.currentElements.length; elm++) 
     { 
      if(validator.currentElements[elm].name == name) 
      { 
       curElement = validator.currentElements[elm]; 
       break; 
      } 
     } 

     validator.errorList.push({ 
      message: errors[name], 
      element: curElement   //this.findByName(name)[0] 
     }); 
    } 
    // remove items from success list 
    validator.successList = $.grep(validator.successList, function(element) { 
     return !(element.name in errors); 
    }); 
} 
validator.settings.showErrors 
    ? validator.settings.showErrors.call(validator, validator.errorMap, validator.errorList) 
    : validator.defaultShowErrors(); 

}

Ce code fonctionne mais ne sera jamais appeler validateur. settings.showErrors parce que je ne pense pas que ShowErrors est validate.unobtrusive.js mais est en validate.js.

Je fini par mettre et à débarrasser le résumé de validation locale:

function ShowValiationSummaryErrors(validator) 
{ 
    var frm = validator.currentForm; 
    var container = $(frm).find("[data-valmsg-summary=true]"), list = container.find("ul"); 

    if (list && validator.errorList.length) { 
     list.empty(); 
     container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); 

     $.each(validator.errorList, function() { 
     $(list).append($("<li />").html(this.message)); 
     }); 
    } 
} 


function ClearValidationSummary() 
{ 
var container = $('form').find('[data-valmsg-summary="true"]'); 
var list = container.find('ul'); 

    if (list && list.length) 
    { 
    list.empty(); 
     container.addClass('validation-summary-valid').removeClass('validation-summary-errors'); 
    } 
} 

Répondre

0

Quelle serait simple est d'avoir votre action du contrôleur renvoie une vue partielle contenant le formulaire, puis mettre à jour les DOM en injectant ce nouveau contenu. De cette façon, les erreurs seront automatiquement affichées. Si vous revenez JSON vous devrez inclure cette information dans la chaîne JSON, puis mettre à jour manuellement les parties concernées pour montrer les erreurs.

+0

Ok, comment est-ce fait? Je retourne une collection de dictionnaire avec le nom et le message qui apparaît du côté du client. Ensuite, je mets à jour les collections validators.errorlist et successlist et j'appelle defaultShowErrors(). Cela met en évidence les champs et affiche le message d'erreur du champ mais ne place pas l'erreur dans le résumé de validation. Je mettrai à jour le message original avec ce code. –

Questions connexes