HandleErrorAttribute不起作用

Mar*_*tin 6 asp.net-mvc asp.net-mvc-3

我在VS10中启动了一个MVC 3模板项目,并修改了global.asax.cs:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute { ExceptionType = typeof(DivideByZeroException), View = "DivideByZeroException", Order = 1 });
    filters.Add(new HandleErrorAttribute { View = "AllOtherExceptions", Order = 2 });
}
Run Code Online (Sandbox Code Playgroud)

到web.config我添加了:

<customErrors mode="On">
Run Code Online (Sandbox Code Playgroud)

然后创建了相应的视图,最后在其中一个动作中添加了DivideByZero-throw.

结果:呈现了视图AllOtherExceptions.

fea*_*net 21

虽然我讨厌不同意达林所说的任何事情,但他错了.

设置属性没有问题(这就是你应该这样做的方式).

原始代码无法按预期工作的唯一原因是因为您Order设置错误.

请参阅MSDN:

OnActionExecuting(ActionExecutingContext),OnResultExecuting(ResultExecutingContext)和OnAuthorization(AuthorizationContext)过滤器以正向顺序运行.OnActionExecuted(ActionExecutedContext),OnResultExecuting(ResultExecutingContext)和OnException(ExceptionContext)过滤器以相反的顺序运行.

因此,您的通用AllOtherExceptions过滤器需要是最低Order数字,而不是最高数字.

希望下次有用.


Dar*_*rov 8

注册全局操作筛选器时,不应设置属性.您可以编写自定义句柄错误过滤器:

public class MyHandleErrorAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
        {
            Exception innerException = filterContext.Exception;
            if ((new HttpException(null, innerException).GetHttpCode() == 500))
            {
                var viewName = "AllOtherExceptions";
                if (typeof(DivideByZeroException).IsInstanceOfType(innerException))
                {
                    viewName = "DivideByZeroException";
                }

                string controllerName = (string)filterContext.RouteData.Values["controller"];
                string actionName = (string)filterContext.RouteData.Values["action"];
                HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                ViewResult result = new ViewResult
                {
                    ViewName = viewName,
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = filterContext.Controller.TempData
                };
                filterContext.Result = result;
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = 500;
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyHandleErrorAttribute());
}
Run Code Online (Sandbox Code Playgroud)

  • 它当然有效.为什么在注册全局动作过滤器时无法设置属性? (3认同)