ASP.NET MVC обрабатывает RequestValidationException в области
У меня есть пользовательский фильтр, который я использовал в течение многих лет для обработки RequestValidationException
с более удобным для пользователя способом. Он работает без проблем во всех сценариях, пока я не представлю Area:
public class HandleHttpRequestValidationExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//base.OnException(filterContext);
if (!(filterContext.Exception is HttpRequestValidationException))
return;
const string viewName = "~/Views/Errors/HttpRequestValidationException.cshtml";
var result = new ViewResult
{
ViewName = viewName,
ViewData = { Model = filterContext.Exception.Message }
};
//result.ViewBag.StatusCode = 200;
filterContext.Result = result;
filterContext.RouteData.Values["area"] = "";
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 200;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Server.ClearError();
}
}
... зарегистрирован в FilterConfig:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new HandleMemberIsNotActivatedOrWaiveredAttribute());
filters.Add(new HandleMemberNotAuthorizedException());
filters.Add(new HandleHttpRequestValidationExceptionAttribute());
}
}
любой RequestValidationException
Брошенный обработан без проблем (я получаю свою симпатичную страницу ошибки с некоторым удобным для пользователя описанием того, что случилось и что с этим делать), за исключением случаев, когда его бросают в Район. В этом случае я получаю пустой ответ с customErrors="On" (и подробный YSOD, если customErrrors="Off"). Если я уберу свой фильтр, то получу YSOD без подробностей (что также бессмысленно). В любом случае Application_Error в Global.asax.cs не запускается. Более того, все мои другие пользовательские фильтры и глобальная обработка исключений работают без каких-либо проблем независимо от того, откуда выбрасывается исключение.
Как я могу справиться RequestValidationException
в удобной для пользователя форме независимо от того, откуда происходит исключение (независимо от того, было ли оно выброшено изнутри Area
)?
Обновление: даже делает filterContext.Result = new RedirectResult("/");
приводит к той же самой пустой странице (и переход по ней указывает, что все хорошо, но нет правильного ответа).
1 ответ
Я полагаю, что вам нужно будет переслать модель ошибок из этой области в контроллер ошибок, чтобы сгенерировать представление. или вам придется направить свой контроллер ошибок в область.
Посмотрите на эту ссылку. Перенаправление из атрибута фильтра действий