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 ответ

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

Посмотрите на эту ссылку. Перенаправление из атрибута фильтра действий

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