Это довольно старое время, и мне не нравится, когда оно без ответа, поэтому я отвечу сам.
Правильным решением является реализация пользовательского атрибута проверки, а также реализация интерфейса IClientValidatable. Это удовлетворяет всем требованиям - отсутствие подключения внутри контроллера и последовательная проверка на стороне клиента.
В настоящее время я, вероятно, даже не реализовал бы это сам - я бы использовал существующую библиотеку, такую как ExpressiveAnnotations , которая предоставляет приятный и гибкий атрибут RequiredIf:
public class Response
{
[Required]
public string ResponseType { get; set; }
[RequiredIf("ResponseType == 'NORMAL'"]
public string State { get; set; }
[RequiredIf("ResponseType == 'ERROR'"]
public string ErrorCode { get; set; }
public string ErrorDescr { get; set; }
}
Атрибут работает как на стороне сервера, так и на стороне клиента, если вы настроите его, добавив несколько строк в Global.asax и включив JavaScript с валидаторами. Вы можете прочитать подробности на странице проекта.