2012-08-27 4 views
7

tengo un IEnumerable que contiene cadenas, utilizando datos de anotaciones para la validación:Usando EditorFor con IEnumerable <string> en MVC 3

[Required(ErrorMessage = "This is required.")] 
[Remote("IsValid", "ControllerName")] 
public IEnumerable<string> MyList { get; set; }  

estoy a continuación, usando esto con un editor de plantillas. Así es como yo lo llamo en mi opinión:

@Html.EditorFor(m => m.MyList) 

Por último, mi plantilla aprovecha esta IEnumarable y crea una serie de elementos de formulario para cada elemento:

@model IEnumerable<string> 
@foreach (var str in Model) 
{ 
    <li> 
     @Html.LabelFor(m => str, "My Label") 
     @Html.TextBoxFor(m => str) 
     @Html.ValidationMessageFor(m => str) 
    </li> 
} 

A pesar de que los elementos de formulario no representan correctamente ¿Me estoy acercando a esto correctamente? Además, he notado que ya no valida. ¿Cómo puedo resolver esto?

Respuesta

7

Lo está haciendo de una manera "correcta". (Correcto en el sentido de que puede funcionar, lo he hecho antes) Pero con la validación la razón por la que creo que no funciona es esta, usted tiene la validación en IEnemerable y no en la cadena. Para obtener la validación de cada cadena. Usted tendría que crear un nuevo modelo de objetos decir

public class LabelString 
{ 
    [Required(ErrorMessage = "This is required.")] 
    public string labelName { get; set; } 
} 

Y a continuación, donde se tiene public IEnumerable<string> MyList { get; set; } reemplazarlo con public IEnumerable<LabelString> MyList { get; set; }

que debe darle la validación en cada una de las etiquetas en el bucle.

3

No es una matemática, por lo que hay más de 1 solución para su problema y no hay uno correcto.

dijo que, sin embargo, prefiero lo planteo de otra manera:

public class StringsViewModel 
{ 
    IEnumerable<string> myList; 
} 

En la vista que necesitará entonces

@model StringsViewModel 
@EditorForModel() 

Se validará porque ahora se ha escrito mucho del modelo en lugar de uno genérico. Además, se ahorra en el foreach bucle que se realiza para usted automágicamente por el marco ...

Espero que esto ayude.

Cuestiones relacionadas