2010-07-19 6 views
2

Dire que j'ai un modèle comme ceci:Validation du modèle avec le dictionnaire

public class MyViewModel { 
    //some properties 
    public string MyString {get;set;} 
    public Dictionary<string,string> CustomProperties {get;set;} 
} 

Et je présente la propriété dictionnaire comme celui-ci:

<%= Html.EditorFor(m => m.CustomProperties["someproperty"]) %> 

Tout fonctionne bien, mais je l'ai mis en œuvre une coutume validator pour valider les propriétés de ce dictionnaire, mais en retournant un ModelValidationResult je ne peux pas obtenir le nom du membre référencé correctement (ce qui devrait être CustomProperties[someproperty] je crois). Tous les éléments de la liste qui sont des propriétés sont liés correctement à leurs erreurs (je veux la classe d'erreur dans la zone de texte pour que je puisse la mettre en évidence).

Voici mon code pour le validateur personnalisé jusqu'à présent

public class CustomValidator : ModelValidator 
{ 
    public Custom(ModelMetadata metadata, ControllerContext controllerContext) : base(metadata, controllerContext) 
    { 
    } 

    public override IEnumerable<ModelValidationResult> Validate(object container) 
    { 
     if (Metadata.PropertyName.Equals("mystring", StringComparison.OrdinalIgnoreCase)) 
     { 
      yield return new ModelValidationResult() {Message = "normal property validator works!!"}; 
     } 
     else if (Metadata.PropertyName.Equals("customproperties", StringComparison.OrdinalIgnoreCase)) 
     { 

      yield return new ModelValidationResult() { MemberName = "CustomProperties[someproperty]", Message = "nope!" }; 
     } 
    } 
} 

Il apparaît comme quelque chose Filling dans la propriété MemberName plus haut, et en ignorant ce que je mets là

Cheers, Amar

+0

Mise à jour: J'ai examiné cela, et il semble que les données d'erreur modelstate sont créées par le DefaultModelBinder qui utilise indirectement une classe privée appelée ModelValidator.CompositeModelValidator. Cette classe privée appelle uniquement CreateSubPropertyName et ne prend pas en compte un indexeur potentiel. Je posterai une solution demain. – amarsuperstar

Répondre

1

Il me semble que vous rendez la validation plus difficile qu'elle ne devrait l'être. Avez-vous jeté un oeil à DataAnnotations qui sont intégrées dans le cadre? Scott Gu's blog talks about this. C'est une manière vraiment agréable (et facile) de faire la validation des modèles.

+0

Oui, je l'utilise pour l'instant, mais j'ai besoin de l'étendre un petit peu, car mes propriétés dans le dictionnaire sont dynamiques (comme le schéma ci-dessous, mais cela est hors de contrôle car je construis quelque chose sur un 3ème produit de fête). J'ai déjà des structures qui vont me dire quelle clé a quelles exigences de validation maintenant je dois juste appliquer cela à mon dictionnaire :) – amarsuperstar

+0

Je l'ai eu en travaillant avec un dictionnaire à la fin, mais des problèmes plus bas dans la ligne m'ont fait décider de utiliser les modèles de vue POCO générés pour ne pas avoir à travailler avec le framework. – amarsuperstar

+0

Il me semble que cette réponse ne répond pas à la question. luttant pour comprendre comment a été accepté en tant que tel ... – marsop

Questions connexes