Свойство Mvc ModelState KeyFor

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

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

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, содержащий постоянные строки, представляющие имена кнопок отправки. И нет, я не могу разделить его на несколько форм из-за того, что представление отображается.

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


person Ales Potocnik Hahonina    schedule 14.11.2011    source источник
comment
Вы когда-нибудь находили решение этой проблемы? ModelState.KeyFor‹MyModel›(m =› m.ValueOne) будет именно тем, что мне нужно для чего-то подобного, что я делаю...   -  person LDJ    schedule 21.03.2013


Ответы (1)


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

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

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

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

person Mohamed.Radwan -MVP    schedule 15.11.2011
comment
Спасибо. Я, конечно, посмотрю, как это сделать. Похоже, он должен уметь делать то, что мне нужно. Я просто надеюсь, что этот подход можно комбинировать со встроенными атрибутами проверки. Я оставлю отзыв, когда у меня будет время протестировать его. - person Ales Potocnik Hahonina; 15.11.2011