Mvc ModelState KeyFor свойство - PullRequest
1 голос
/ 14 ноября 2011

Всякий раз, когда нужно выполнить какую-либо пользовательскую проверку или возиться с ModelState, мне приходилось полагаться на магические строки (которые отражают имена свойств).Конечно, должен быть лучший способ.

скажем, у вас есть форма с 2 кнопками отправки.Вы уже установили правила проверки, добавив Обязательные атрибуты:

public class MyModel
{
    [Required]
    public string ValueOne { get; set; }
    [Required]
    public string ValueTwo { get; set; }
}

Это будет всегда проверять оба поля.Но скажем, я добавил две кнопки для отображения формы и редактора для модели выше.Для первой кнопки требуется только ValueOne, а для второй - только ValueTwo.

Typically I would have custom validation code that checks which button was clicked and do something along the lines:

private void ValidateViewModel(MyModel viewModel)
{
    foreach (var key in ModelState.Keys)
        ModelState[key].Errors.Clear();
    if (Request[{ButtonOneName}] != null && string.IsNullOrEmpty(viewModel.ValueOne))
        ModelState.AddModelError("ValueOne", "Required");
    else if (Request[{ButtonTwoName}] != null && string.IsNullOrEmpty(viewModel.ValueTwo))
        ModelState.AddModelError("ValueTwo", "Required");
}

Не очень красиво, я знаю, но ... Моя говядина с волшебными строками "ValueOne" и "ValueTwo".Также с тем, как устраняются ошибки.Есть ли способ генерировать эти ключи?Я ищу что-то вроде:

ModelState.KeyFor<MyModel>(m => m.ValueOne)

А потом логическое расширение:

ModelState.Get<MyModel>(m => m.ValueOne)

Прежде чем я начну изобретать велосипед - уже есть что-то подобное, спрятанное где-то?*

Прежде чем вы спросите, я обычно определяю статический класс SubmitActions, содержащий константные строки, которые представляют имена кнопок отправки.И нет, я не могу разделить его на несколько форм, потому что было отображено представление.

Спасибо за любые предложения.

1 Ответ

1 голос
/ 15 ноября 2011

В MVC 3 есть усовершенствования проверки моделей, которые позволят вам проверить проверку на основе свойств, связанных друг с другом

Таким образом, с помощью интерфейса IValidatableObject, встроенного в .NET 4, для реализациипользовательский метод проверки класса.Этот метод может применять правила проверки к нескольким свойствам и возвращать несколько ошибок проверки,

Вы смотрели на это?

Часть Усовершенствования проверки модели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...