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