2011-04-01 17 views
6

Estoy usando asp.net mvc 3 con jquery validación discreta. Recientemente cambié de DataAnnotations estándar a FluentValidation y funciona muy bien.mvc validación del lado del cliente para propiedades anidadas (recopilación)

Mi razón principal para elegir FluentValidation fue la necesidad de validar las propiedades anidadas en mi viewmodel (pero encontré que hay otras razones interesantes para usarlo) que se parece así (no importa que los accesors sean pseudo):

class Vm { 
    string Prop; 
    string AnotherProp; 
    IEnumerable<ElementsVm> Elements; 
} 

class ElementsVm { 
    bool Required; 
    string Id; 
    string Title; 
    string Value; 
} 

Usando FluentValidation hago un validador para VM y para ElementVm y mis pruebas unitarias son de color verde, y me mostró la validación del lado del servidor está funcionando.

El lado del cliente, 'Prop' y 'AnotherProp' funciona - mis reglas de validación también se ejecutan en el cliente como se esperaba (como lo harían con DataAnnontation), pero todos mis elementos no reciben ninguna validación del lado del cliente - Inspecciono el dom y puedo ver que faltan todos los atributos data-val, data-required, etc.

He intentado diferentes enfoques para generar el html en mis vistas, pero el 'Prop' y 'AnotherProp' se generan utilizando Html.TextBoxFor (m => m.Prop) mientras mis elementos se generan en un parcial - aquí es donde comienzan los problemas. Si elijo Html.TextBoxFor (m => m.Value), todos mis Text Boxes de elementos tendrán el mismo nombre/id, así que también intenté usar Html.TextBox (Model.Id) para generar identificador/nombre único, pero todavía no tengo propiedades de validación. .

Así que hay una manera de hacer que mi senario funcione, no me importa reescribirlo un poco, pero realmente me gustaría que FluentValidation me escriba mi html.

Mi solución alternativa sería crear mis propios ayudantes Html para generar el HTML correcto con atributos, pero eso sería una mierda, creo, ya que tendría que seguir actualizando esos ayudantes cuando se realizaran nuevas versiones/parches en FluentValidation, validación jquery o el enlace en mvc entre los dos.

Respuesta

8

En su parcial, antes de cada instancia de ElementsVM, debe configurar un prefijo único usando ViewData.TemplateInfo.HtmlFieldPrefix, así:

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
} 

Esto debe darle sus atributos de validación discreto, y también hay que trabajar con la carpeta de modelo predeterminada.

counsellorben

+0

¡Gracias! Esto funciona, y debe marcarse como la respuesta. – JustinP8

+1

Además, no olvide restablecer 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' si tiene entradas después del bucle. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: Tengo el mismo problema, pero esto no lo solucionó. Estoy usando EditorTemplates para mi colección anidada y todos los atributos 'id' de la etiqueta 'input' ya tienen como prefijo los "Elementos [0] apropiados/equivalentes". El 'ViewData.TemplateInfo.HtmlFieldPrefix' es útil para saber, pero no es el problema para mí. @Per mencionó que faltan los atributos 'data-val, data-required etc.'. Me he dado cuenta de lo mismo. – tkerwood

Cuestiones relacionadas