ASP.NET MVC在Area中处理RequestValidationException

Ted*_*Ted 5 c# asp.net-mvc requestvalidationmode asp.net-mvc-5

我有一个自定义过滤器,我用了多年来以RequestValidationException更加用户友好的方式处理s.在我介绍区域之前,它在所有场景中都没有问题:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

...在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

RequestValidationException抛出任何抛出都没有问题(我得到了我的漂亮错误页面,其中包含一些用户友好的描述,说明发生了什么以及该怎么做),除非在某个区域中抛出一个.在这种情况下,我得到一个空白的响应,其中customErrors ="On"(如果customErrrors ="Off",则为详细的YSOD).如果我删除我的过滤器,那么我得到无详细信息YSOD(这也没有意义).无论哪种方式,Global.asax.cs中的Application_Error都不会被触发.此外,无论引发异常的位置如何,我的所有其他自定义过滤器和全局异常处理都可以正常工作.

RequestValidationException无论异常源自何处(无论是否从中抛出Area),我如何以用户友好的方式处理?

更新:甚至filterContext.Result = new RedirectResult("/");在相同的空白页面中执行结果(并单步执行它表示一切都很好,但没有正确的响应).

poo*_*pro 0

我相信您需要将错误模型从该区域转发到错误控制器才能生成视图。否则您必须将错误控制器路由到该区域。

看看这个链接。 从操作过滤器属性重定向