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数字,而不是最高数字.
希望下次有用.
注册全局操作筛选器时,不应设置属性.您可以编写自定义句柄错误过滤器:
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)
| 归档时间: |
|
| 查看次数: |
4975 次 |
| 最近记录: |