2010-03-17 5 views
6

EDIT: mis à jour cette question MVC 2.0
Avec asp.net MVC 2.0 est là une méthode existante de création Résumé de validation qui est logique pour les modèles contenant des collections? Sinon, je peux créer mon propre résumé de validationValidation des collections Résumé

Exemple Modèle:

public class GroupDetailsViewModel 
{ 
    public string GroupName { get; set; } 
    public int NumberOfPeople { get; set; } 
    public List<Person> People{ get; set; } 
} 

public class Person 
{ 
    [Required(ErrorMessage = "Please enter your Email Address")] 
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid Email Address")] 
    public string EmailAddress { get; set; } 

    [Required(ErrorMessage = "Please enter your Phone Number")] 
    public string Phone { get; set; } 

    [Required(ErrorMessage = "Please enter your First Name")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please enter your Last Name")] 
    public string LastName { get; set; } 
} 

Le résumé existant <%=Html.ValidationSummary %> si rien n'est entré ressemble à ceci.

L'erreur suivante (s) doit être corrigée avant de passer à l'étape suivante
* S'il vous plaît, entrez votre adresse e-mail
* S'il vous plaît entrer votre numéro de téléphone
* S'il vous plaît entrer votre Prénom
* S'il vous plaît entrer votre Nom
* S'il vous plaît entrez votre adresse e-mail
* S'il vous plaît entrer votre numéro de téléphone
* S'il vous plaît entrer votre prénom
* S'il vous plaît entrer votre nom de famille

La conception appelle pour les titres à insérer comme ceci:

L'erreur suivante (s) doit être corrigée avant de passer à l'étape suivante
Personne 1
* S'il vous plaît, entrez votre adresse e-mail
* S'il vous plaît entrer votre numéro de téléphone
* S'il vous plaît entrer votre Prénom
* S'il vous plaît entrer votre Nom
Perso n 2
* S'il vous plaît entrez votre adresse email
* S'il vous plaît entrer votre numéro de téléphone
* S'il vous plaît entrer votre Prénom
* S'il vous plaît entrez votre Nom

Réponse Sur la base de la réponse de Pharcyde.

public static MvcHtmlString NestedValidationSummary(this HtmlHelper helper) 
{ 
    if (helper.ViewData.ModelState.IsValid) 
     return MvcHtmlString.Empty; 

    // create datastructure to group error messages under a given key (blank key is for general errors) 
    var errors = new Dictionary<string,List<string>>(); 
    foreach (KeyValuePair<string, ModelState> keyPair in helper.ViewData.ModelState) 
    { 
     foreach (ModelError error in keyPair.Value.Errors) 
     { 
      //determine the 'key' for the group in which this error belongs 
      var key = keyPair.Key.Split(']')[0]; 
      if (key.Contains("People[")) 
       key = "Person " + key.Split('[')[1]; 
      else 
       key = string.Empty; 

      if(!errors.ContainsKey(key)) 
       errors.Add(key,new List<string>()); 
      //now add message using error.ErrorMessage property 
      errors[key].Add(error.ErrorMessage); 
     } 
    } 

    // generate the HTML 
    var ul = new TagBuilder("ul"); 
    foreach (KeyValuePair<string, List<string>> errorPair in errors.OrderBy(p=>p.Key)) 
    { 
     var li = new TagBuilder("li"); 
     if(!string.IsNullOrEmpty(errorPair.Key)) 
      li.InnerHtml += string.Format("<p class=\"no-bottom-margin\"><strong>{0}</strong></p>",errorPair.Key); 
     var innerUl = new TagBuilder("ul"); 
     foreach (var message in errorPair.Value) 
     { 
      var innerLi = new TagBuilder("li"); 
      innerLi.InnerHtml = message; 
      innerUl.InnerHtml += innerLi.ToString(TagRenderMode.Normal); 
     } 
     li.InnerHtml += innerUl.ToString(TagRenderMode.Normal); 
     ul.InnerHtml += li.ToString(TagRenderMode.Normal); 
    } 

    return MvcHtmlString.Create(ul.ToString(TagRenderMode.Normal)); 
} 
+1

Je viens d'avoir la même question freakin. Devinez alors la réponse n'est pas tellement ..... – Terrance

Répondre

3

Vous allez devoir étendre les méthodes HtmlHelper et rouler les vôtres. Heres le peu de code qui est important pour votre situation où vous avez besoin d'un groupe par:

//HtmlHelper being extended 
if(helper.ViewData.ModelState.IsValid) 
{ 
    foreach(KeyValuePair<string,ModelState> keyPair in helper.ViewData.ModelState) 
    {  
     //add division for group by here using keyPair.Key property (would be named "Person" in your case). 

     foreach(ModelError error in keyPair.Value.Errors) 
     { 
      //now add message using error.ErrorMessage property 
     } 
    } 
} 
+0

Oui j'ai écrit mon propre basé sur votre réponse, je l'ai inclus dans la question. – Myster