2010-03-17 17 views
6

EDIT: actualizar a esta pregunta MVC 2.0
Con asp.net MVC 2.0 es que hay un método existente de crear Resumen de validación que tenga sentido para los modelos que contienen colecciones? Si no puedo crear mi propio resumen de validaciónValidación Resumen de Colecciones

Modelo de ejemplo:

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

El resumen existente <%=Html.ValidationSummary %> si no se introduce nada se parece a esto.

el siguiente error (s) se debe corregir antes de proceder al siguiente paso
* Por favor, introduzca su dirección de correo electrónico
* Por favor, introduzca su número de teléfono
* Por favor, introduzca su nombre de pila
* Por favor, introduzca su apellido
* Por favor, introduzca su dirección de correo electrónico
* Por favor, introduzca su número de teléfono
* Por favor, introduzca su nombre
* Por favor, introduzca su apellido

El diseño requiere de rúbricas que se insertan como esto:

el siguiente error (s) debe ser corregida antes de proceder al siguiente paso
Persona 1
* Por favor, introduzca su dirección de correo electrónico
* Por favor, introduzca su número telefónico
* Por favor, introduzca su nombre de pila
* Por favor, introduzca su apellido
Perso n 2
* Por favor, introduzca su dirección de correo electrónico
* Por favor, introduzca su número de teléfono
* Por favor, introduzca su nombre de pila
* Por favor introduzca su apellido

respuesta Sobre la base de la respuesta 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

Tengo toda la misma maldita pregunta. Adivina entonces la respuesta no es tanto ... – Terrance

Respuesta

3

Tendrás que extender los métodos HtmlHelper y hacer los tuyos propios. Aquí está el código que es importante para su situación en la que necesita un grupo por:

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

Sí, escribí el mío basado en tu respuesta, lo he incluido en la pregunta. – Myster

Cuestiones relacionadas