В основном получил модель с двумя свойствами:
public int CatID {get; set;}
[Required]
public string CatName {get; set;}
При визуализации с использованием @Html.DropDownFor
и TextBoxFor
применяется ненавязчивая проверка, поэтому требуется CatName
.
CatName
отображается только в том случае, если установлено CatID
, в противном случае для некоторого контейнера текстового поля будет установлено значение display: none
. Ненавязчивая проверка не выполняется для скрытых элементов, поэтому это прекрасно работает, позволяя отправлять форму, если CatName
не задано, потому что она не видна.
Однако в коде MVC состояние модели недопустимо, если CatName
не установлено независимо от CatID
.
Что мне нужно, так это способ применять условную валидацию как на сервере, так и на клиенте наилучшим образом.
Я могу заставить модель реализовать IValidatableObject
для обработки на стороне сервера, реализовав свой собственный код для проверки полей, однако мне пришлось бы удалить атрибут [Required]
, который не позволил бы работать ненавязчивой проверке.
В идеале мне бы хотелось элегантное решение, которое бы позволяло проверять как на стороне клиента, так и на стороне сервера, и при этом иметь возможность использовать ModelState.IsValid
в моем контроллере, который не супер-хакерский, но у меня нет идей. В идеале, я хочу, чтобы он управлялся атрибутами модели или моделью, поэтому проверка является автономной, то есть пользовательский интерфейс не должен иметь какой-либо специфичный для модели код - если я позже изменю модель, чтобы сказать, что она не требуется для пример, я не хочу обновлять мой интерфейс.