Подтвердить что ты не робот

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 и использовать ее.

Нет ли лучшего способа сделать это?

4b9b3361

Ответ 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.