Как обрабатывать исключения проверки запросов ASP.NET MVC3 как ошибки проверки модели или свойства

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

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

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

1 ответ

Решение

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

    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();
    }

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

Другие вопросы по тегам