ValidationMessageДля вместе с AddModelError (ключ, сообщение). Какой ключ?
Я разрабатываю проверку на стороне клиента и на стороне сервера для определенного свойства viewModel.
В файле .cshtml
я помещаю это:
@Html.DropDownListFor(model => model.EntityType.ParentId, Model.ParentTypeList, "")
@Html.ValidationMessageFor(model => model.EntityType.ParentId)
В контроллере для проверки бизнеса
catch (BusinessException e)
{
ModelState.AddModelError("EntityType.ParentId", Messages.CircularReference);
}
Выше работает как и ожидалось: если исключение поймано, сообщение появляется рядом с выпадающим списком.
Однако я считаю, что этот способ не очень изящный. В cshtml
я использую метод для генерации всей необходимой информации о проверке. В контроллере я должен знать точную строку Key и использовать ее.
Нет ли лучшего способа сделать это?
Ответы
Ответ 1
Вы можете написать метод расширения, который будет принимать лямбда-выражение для ключа вместо строки:
public static class ModelStateExtensions
{
public static void AddModelError<TModel, TProperty>(
this ModelStateDictionary modelState,
Expression<Func<TModel, TProperty>> ex,
string message
)
{
var key = ExpressionHelper.GetExpressionText(ex);
modelState.AddModelError(key, message);
}
}
а затем используйте этот метод:
catch (BusinessException e)
{
ModelState.AddModelError<MyViewModel, int>(
x => x.EntityType.ParentId,
Messages.CircularReference
);
}
Ответ 2
Я следую решению @Darin Dimitrov, но я хочу избежать <MyViewModel, int>
, поэтому я использовал другой способ, но для этого вам нужно MyViewModel object variable.
public static class ModelStateExtensions
{
public static void AddModelError<TModel, TProperty>(this TModel source,
Expression<Func<TModel, TProperty>> ex,
string message,
ModelStateDictionary modelState)
{
var key = System.Web.Mvc.ExpressionHelper.GetExpressionText(ex);
modelState.AddModelError(key, message);
}
}
Как использовать:
catch (BusinessException e)
{
objMyViewModel.AddModelError(x => x.EntityType.ParentId,
Messages.CircularReference,
ModelState);
}
Ответ 3
Вы хотите, чтобы проверка выполнялась как на стороне клиента, так и на стороне сервера, а также вы искали элегантное решение, поэтому попробуйте создать пользовательский ValidationAttribute
.