Как обрабатывать исключения проверки запросов 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();
}
Это добавит исключение только проверки запроса в состоянии модели. Извините, если я не понимаю ваш вопрос ясно.