2009-12-21 3 views
0

Ok, disons que votre vue comporte quatre partiels (chacun avec des modèles de vue séparés) qui sont tous liés au mode de vue principal. Vous cliquez sur Envoyer et tous vos messages sont affichés. Vous effectuez une validation côté serveur et vous remarquez que des erreurs de validation sont survenues dans les champs de 3 des 4 partiels. Donc, je veux poster les erreurs de validation mais au dessus du partiel où elles appartiennent.Mise en œuvre de la messagerie utilisateur ASP.NET MVC

Quelles sont vos pensées de mise en œuvre?

Répondre

2

scénario intéressant. Si je vous comprends bien: vous souhaitez valider un post de formulaire complexe et s'il n'est pas valide, retournez-le à la vue et affichez les messages d'erreur au-dessus de leurs zones de formulaire respectives. La raison pour laquelle vous ne pouvez pas utiliser <% = Html.ValidationSummary()%> est que vous avez besoin de différents résumés pour différentes zones de votre formulaire en fonction de ce qui est valide et de ce qui ne l'est pas? Prenez-le avec un grain de sel, mais ce que je ferais est d'écrire un HtmlHelper personnalisé pour chaque zone de formulaire ou partielle. Vous pouvez baser votre code personnalisé sur l'implémentation actuelle de Html.ValidationSummary et trouver le code here. Dans chaque résumé de validation personnalisé, vous pouvez rechercher des erreurs spécifiques dans ModelState et les afficher. Je n'ai pas beaucoup de temps et n'ai pas testé, mais cela peut vous aider à démarrer:

public static class CustomValidationExtensions 
{ 
    public static string CustomValidationSummary(this HtmlHelper htmlHelper) 
    { 
     if (!htmlHelper.ViewData.ModelState.ContainsKey("YourFormName")) 
      return null; 

     ModelState modelState = htmlHelper.ViewData.ModelState["YourFormName"]; 
     ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; 
     ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0]; 

     if (modelError == null) 
      return null; 

     TagBuilder builder = new TagBuilder("span"); 
     builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName); 
     builder.SetInnerText(modelError.ErrorMessage); 

     return builder.ToString(TagRenderMode.Normal); 
    } 
} 

Ce ne vérifie un élément ModelState et affiche une html. Vous voudrez ajouter tous vos éléments ModelState à la main ou en boucle sur la collection et n'afficher que les messages d'erreur qui s'appliquent à cette vue partielle. De toute façon, je pense que votre meilleur pari est d'ajouter des erreurs à ModelState la manière typique et de travailler directement avec ModelState pour afficher uniquement les erreurs qui s'appliquent à cette partie. Et bien sûr vous pouvez manipuler le HTML et faire ce que vous voulez avec la sortie.