5

我有一个自定义过滤器,多年来我一直使用它来RequestValidationException以更加用户友好的方式处理 s。在我介绍一个 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抛出的东西都可以毫无问题地处理(我得到了漂亮的错误页面,其中包含一些用户友好的关于发生了什么以及如何处理它的描述),除非将一个抛出到 Area中。在这种情况下,我得到一个带有 customErrors="On" 的空白响应(如果 customErrors="Off" 则为详细的 YSOD)。如果我删除我的过滤器,那么我会得到没有详细信息的 YSOD(这也是毫无意义的)。无论哪种方式,Global.asax.cs 中的 Application_Error 都不会被触发。此外,我的所有其他自定义过滤器和全局异常处理都可以正常工作,无论异常是从哪里引发的。

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

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

4

1 回答 1

0

我相信您需要将该区域的错误模型转发到您的错误控制器以生成视图。否则您将不得不将错误控制器路由到该区域。

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

于 2015-06-26T17:29:07.300 回答