2011-04-01 3 views
6

J'utilise asp.net mvc 3 avec jquery validation discrète. Je suis récemment passé de DataAnnotations standard à FluentValidation et cela fonctionne très bien. La raison principale pour laquelle j'ai choisi FluentValidation était la nécessité de valider les propriétés imbriquées sur mon viewmodel (mais j'ai trouvé qu'il y avait d'autres bonnes raisons de l'utiliser) qui ressemble à ça (ça ne dérange pas les pseudo):mvc validation côté client pour les propriétés imbriquées (collection)

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

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

en utilisant FluentValidation je fais un validateur pour Vm et ElementVm et mes tests unitaires sont verts, me montrant la validation côté serveur fonctionne. Côté client, 'Prop' et 'AnotherProp' fonctionnent - mes règles de validation sont également exécutées côté client comme prévu (comme avec DataAnnontation), mais tous mes éléments ne reçoivent aucune validation côté client - J'inspecte le dom et peux voir toutes les données-val, data-required etc. les attributs manquent.

J'ai essayé différentes approches pour générer le html dans mes vues, mais le 'Prop' et 'AnotherProp' sont générés en utilisant Html.TextBoxFor (m => m.Prop) tandis que mes éléments sont générés dans un partiel - C'est là que les problèmes commencent. Si je choisis Html.TextBoxFor (m => m.Value) toutes mes boîtes de texte d'élément auront le même nom/id, ainsi j'ai essayé également d'employer Html.TextBox (model.Id) pour produire l'id/name unique mais toujours aucune propriétés de validation .

Donc, y a-t-il un moyen de faire fonctionner mon senario - ça ne me dérange pas de le réécrire un peu, mais j'aimerais vraiment que FluentValidation m'écrive mon html. Ma solution de secours consisterait à créer mes propres Html Helpers pour générer le Html correct avec les attributs, mais cela serait nul, car je devrais continuer à mettre à jour ces helpers quand de nouvelles versions/patches ont été faites à FluentValidation, jquery validation ou le lien en mvc entre les deux.

Répondre

8

Dans votre partielle, avant chaque instance de ElementsVM, vous devez définir un préfixe unique en utilisant ViewData.TemplateInfo.HtmlFieldPrefix, comme ceci:

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

Cela devrait vous donner les attributs de votre validation discrète, et devrait également travailler avec le classeur par défaut.

counsellorben

+0

Merci! Cela fonctionne, et devrait être marqué comme la réponse. – JustinP8

+1

Aussi, n'oubliez pas de réinitialiser 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' si vous avez des entrées après la boucle. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: J'ai le même problème, mais cela ne l'a pas résolu. J'utilise EditorTemplates pour ma collection imbriquée et tous les attributs 'id' de la balise 'input' sont déjà préfixés avec les "Elements [0]" appropriés/équivalents. Le 'ViewData.TemplateInfo.HtmlFieldPrefix' est pratique à connaître, mais pas le problème pour moi. @Per a mentionné que les attributs 'data-val, data-required etc. sont manquants'. J'ai remarqué la même chose. – tkerwood

Questions connexes