Как обрабатывать исключения проверки запросов ASP.NET MVC3 как ошибки проверки модели или свойства - PullRequest
9 голосов
/ 13 февраля 2012

Надеюсь, мой вопрос довольно прост.После отправки формы я хотел бы отметить все свойства (поля), которые содержат недопустимые символы (в частности, HTML), как ошибки модели.Проблема, с которой я сталкиваюсь, заключается в том, что запрос на подтверждение запускает до привязки / проверки модели, и я получаю HTTP 500 ... Я видел аналогичный вопрос , который рекламирует либоиспользуя [AllowHtml] атрибут свойства в вашей Model / ViewModel или используя <httpRuntime requestValidationMode="2.0" /> в web.config, но я ищу, как " глобально перехватить исключения проверки запроса и показать их как ошибки модели ».Кроме того, я не хочу «обрезать» HTML-теги, я хочу уведомить пользователя о том, что его ввод недопустим.

Я думал об использовании атрибутов проверки регулярного выражения, чтобы найти неправильный ввод, но, как я уже говорилпроверка запроса в ASP.NET MVC3 происходит до привязки / проверки модели, так что это не требуется ...

Действительно хороший обзор проверки запроса можно найти здесь .

1 Ответ

10 голосов
/ 13 февраля 2012

Я думаю, что ваше единственное намерение - получить исключение проверки запроса во время привязки модели и показать ошибки как ошибку состояния модели. Вот образец,

    using System.Web.Helpers;
    public class MyModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            try
            {
                return base.BindModel(controllerContext, bindingContext);
            }
            catch(HttpRequestValidationException ex)
            {
                var modelState = new ModelState();
                modelState.Errors.Add(ex.Message);
                var key=bindingContext.ModelName;
                var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key];
                modelState.Value = new ValueProviderResult(value, value,CultureInfo.InvariantCulture);
                bindingContext.ModelState.Add(key, modelState);
            }
            return null;
        }
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        ModelBinders.Binders.DefaultBinder = new MyModelBinder();
    }

Это добавит исключение только проверки запроса в состоянии модели. Извините, если я не понимаю ваш вопрос ясно.

...