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