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