Я решил эту проблему, обработав словарь ModelState , который содержится в контроллере. Словарь ModelState включает в себя все элементы, которые должны быть проверены.
Вот решение:
Если вам нужно реализовать условную проверку на основе некоторого поля (например, если A = true, тогда требуется B), при сохранении сообщений об ошибках на уровне свойств (это не true для пользовательских валидаторов, находящихся на уровне объекта), вы можете достичь этого, обрабатывая «ModelState», просто удаляя из него нежелательные проверки.
... В каком-то классе ...
public bool PropertyThatRequiredAnotherFieldToBeFilled
{
get;
set;
}
[Required(ErrorMessage = "*")]
public string DepentedProperty
{
get;
set;
}
... класс продолжается ...
... В некоторых действиях контроллера ...
if (!PropertyThatRequiredAnotherFieldToBeFilled)
{
this.ModelState.Remove("DepentedProperty");
}
...
При этом мы достигаем условной проверки, оставляя все остальное таким же.
UPDATE:
Это моя последняя реализация: я использовал интерфейс модели и атрибут действия, который проверяет модель, которая реализует указанный интерфейс. Интерфейс предписывает метод Validate (ModelStateDictionary modelState). Атрибут для действия просто вызывает Validate (modelState) для IValidatorSomething.
Я не хотел усложнять этот ответ, поэтому я не упомянул окончательные детали реализации (которые, в конце концов, имеют значение в рабочем коде).