ValidationMessageFor avec AddModelError (clé, message). Quelle est la clé?

Je développe actuellement une validation côté client et côté serveur pour une certaine propriété viewModel.

Dans le fichier .cshtml , j’ai mis ceci:

 @Html.DropDownListFor(model => model.EntityType.ParentId, Model.ParentTypeList, "") @Html.ValidationMessageFor(model => model.EntityType.ParentId) 

Dans le contrôleur pour la validation commerciale

 catch (BusinessException e) { ModelState.AddModelError("EntityType.ParentId", Messages.CircularReference); } 

Ce qui précède fonctionne normalement: si une exception est interceptée, le message apparaît en regard de la liste déroulante.

Cependant, je trouve que cette façon n’est pas très élégante. Dans le cshtml , j’utilise une méthode pour générer toutes les informations requirejses sur la validation. Dans le contrôleur, je dois connaître la chaîne de clé exacte et l’utiliser.

N’y a-t-il pas une meilleure façon de faire cela?

Vous pouvez écrire une méthode d’extension qui utilisera une expression lambda pour la clé au lieu d’une chaîne:

 public static class ModelStateExtensions { public static void AddModelError( this ModelStateDictionary modelState, Expression> ex, ssortingng message ) { var key = ExpressionHelper.GetExpressionText(ex); modelState.AddModelError(key, message); } } 

puis utilisez cette méthode:

 catch (BusinessException e) { ModelState.AddModelError( x => x.EntityType.ParentId, Messages.CircularReference ); } 

Je suis la solution @Darin Dimitrov mais je veux éviter donc j’ai utilisé une méthode différente, mais pour cela vous avez besoin de la MyViewModel object variable.

 public static class ModelStateExtensions { public static void AddModelError(this TModel source, Expression> ex, ssortingng message, ModelStateDictionary modelState) { var key = System.Web.Mvc.ExpressionHelper.GetExpressionText(ex); modelState.AddModelError(key, message); } } 

Comment utiliser:

 catch (BusinessException e) { objMyViewModel.AddModelError(x => x.EntityType.ParentId, Messages.CircularReference, ModelState); } 

Vous voulez que la validation ait lieu à la fois côté client et côté serveur et que vous cherchez également une solution élégante, alors pourquoi pouvez-vous essayer de créer un atsortingbut ValidationAtsortingbute personnalisé.