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
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