2011-04-01 3 views
6

Sto usando asp.net mvc 3 con validazione jQuery discreta. Recentemente ho cambiato da DataAnnations standard a FluentValidation e funziona alla grande.validazione clientide mvc per proprietà nidificate (raccolta)

Il mio motivo principale per il rilevamento di FluentValidation è stata la necessità di convalidare proprietà nidificate sul mio viewmodel (ma ho trovato che ci sono altri motivi interessanti per utilizzarlo) che assomiglia a questo (non importa che gli utenti siano pseudo):

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

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

Utilizzando FluentValidation Faccio un validatore per VM e per ElementVm e mio test di unità sono verdi, mostrandomi lato server convalida sta lavorando.

Lato client, "Prop" e "AnotherProp" funzionano: le mie regole di convalida eseguono anche il lato client come previsto (come farebbero con DataAnnontation), ma tutti i miei elementi non ricevono alcuna convalida sul lato client a tutti - Ispeziono il dom e posso vedere tutti gli attributi data-val, data-required ecc. mancanti.

Ho provato diversi approcci per generare l'html nelle mie viste, ma "Prop" e "AnotherProp" sono generati usando Html.TextBoxFor (m => m.Prop) mentre i miei elementi sono generati in un partial - questo è dove iniziano i problemi. Se scelgo Html.TextBoxFor (m => m.Value) tutte le mie caselle di testo elemento avranno lo stesso nome/id, quindi ho anche provato a utilizzare Html.TextBox (Model.Id) per generare un ID/nome univoco, ma ancora nessuna proprietà di convalida .

Quindi c'è un modo per far funzionare il mio senario - non mi dispiace riscriverlo un po ', ma mi piacerebbe molto che FluentValidation scriva il mio html per me.

La mia soluzione di ripiego sarebbe quello di rendere i miei aiutanti HTML per generare la correttezza del codice HTML con gli attributi, ma che avrebbe fatto schifo, credo, dal momento che avrei dovuto tenere aggiornata questi aiutanti quando/sono state effettuate a uno FluentValidation nuove release patch, validazione jquery o il collegamento in mvc tra i due.

risposta

8

Nella tua parziale, prima di ogni istanza di ElementsVM, è necessario impostare un prefisso univoco utilizzando ViewData.TemplateInfo.HtmlFieldPrefix, in questo modo:

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

Questo dovrebbe dare attributi vostra convalida discreto, e dovrebbe anche funzionare con il raccoglitore modello predefinito.

counsellorben

+0

Grazie! Funziona e dovrebbe essere contrassegnato come risposta. – JustinP8

+1

Inoltre, non dimenticare di reimpostare 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' se hai input dopo il ciclo. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: Sto avendo lo stesso problema, ma questo non l'ha risolto. Sto usando EditorTemplates per la mia collezione nidificata e tutti gli attributi 'id' del tag 'input' sono già preceduti dall'appropriato/equivalente "Elements [0]". Il 'ViewData.TemplateInfo.HtmlFieldPrefix' è utile sapere, ma non il problema per me. @Per ha affermato che mancano gli attributi "data-val, data-required etc.". Ho notato la stessa cosa. – tkerwood