Надежно обрабатывать ошибки привязки модели ASP.NET MVC - PullRequest
7 голосов
/ 17 ноября 2011

Я разрабатываю REST API с использованием контроллеров MVC. Я хотел бы обработать все ошибки привязки модели и сообщить о них клиенту в удобной для пользователя форме. В моих пользовательских подшивках моделей я уже выбрасываю специальное исключение, которое обработчик исключений считает безопасным и показывает клиенту.

Однако, когда средство связывания модели по умолчанию видит недопустимое значение (скажем, asdf для int), оно либо полностью игнорирует его (если параметр не требуется), либо выдает простое значение ArgumentException (если параметр обязателен). Можно ли надежно обработать оба случая и получить имя параметра и связанную с ним ошибку, не переписывая весь переплет вручную?

Я бы не стал показывать ArgumentException как есть, потому что он показывает имена методов и пространств имен, о которых клиент не должен заботиться. Я бы также предпочел не анализировать сообщение ArgumentException, если его можно избежать, и это не решило бы проблему с неверными значениями для необязательных параметров, которые полностью игнорируются.

1 Ответ

3 голосов
/ 15 мая 2012

Вы можете реализовать интерфейс IValidatableObject на вашей модели. Там вы можете создать свою собственную логику проверки, заменив атрибут проверки Required, который у вас есть на данный момент.

public class Model : IValidatableObject {
    public int MyIntProperty { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        if (MyIntProperty == 0) {
            yield return new ValidationResult("Please provide a valid value for MyIntProperty.", new[] { "MyIntProperty" });
        }
    }
}

В вашем контроллере вы можете проверить коллекцию ModelState.Errors, чтобы увидеть ошибки проверки. Кроме того, это сгенерирует CSS-класс ошибки на стороне клиента, если вы используете строго типизированное представление и помощники HTML-формы.

...