Asp.net mvc MVC HandleError vs customErrors标签
因此,如果我正确理解了Asp.net mvc MVC HandleError vs customErrors标签,asp.net-mvc,error-handling,Asp.net Mvc,Error Handling,因此,如果我正确理解了[HandleError],您必须将其添加到您希望处理错误的每个控制器中 只需将错误页面的路径添加到web.config customErrors标记中似乎就容易多了: <customErrors mode="On" defaultRedirect="~/Error/Index" > </customErrors> 在什么情况下使用[HandleError]会比这更好?在[HandleError]中,您可以实现很多。您可以记录错误。您还可以找出
[HandleError]
,您必须将其添加到您希望处理错误的每个控制器中
只需将错误页面的路径添加到web.config customErrors标记中似乎就容易多了:
<customErrors mode="On" defaultRedirect="~/Error/Index" >
</customErrors>
在什么情况下使用[HandleError]会比这更好?在
[HandleError]
中,您可以实现很多。您可以记录错误。您还可以找出错误的类型,并根据情况将用户重定向到特定页面。以下是一个示例-
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
string referrerController = string.Empty;
string referrerAction = string.Empty;
if (filterContext.HttpContext.Request.UrlReferrer != null)
{
string[] segments = filterContext.HttpContext.Request.UrlReferrer.Segments;
if (segments.Length > 1)
{
referrerController = segments[1] != null ? segments[1].Replace("/", string.Empty) : string.Empty;
}
if (segments.Length > 2)
{
referrerAction = segments[2] != null ? segments[2].Replace("/", string.Empty) : string.Empty;
}
}
filterContext.Controller.TempData["exception"] = filterContext.Exception.Message;
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
new { controller = referrerController , action = referrerAction}));
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
在此代码中,我将异常消息保存到TempData
,以便向用户显示错误消息。这只是一个例子,但您可以根据需求做任何事情。在这里,我通过继承filteratAttribute
并实现IEExceptionFilter
来创建自己的[HandleError]
属性。你可以看到我在这里获得的力量。我实现了自己的属性来处理我的需求。但使用内置的[HandleError]
也可以获得类似的结果
第2行的目的是处理一个场景,其中链中的其他人已经处理了异常。那么在这种情况下,你可能不会有兴趣再次处理它。Response.Clear()用于在将用户重定向到新页面之前清除管道。在您的情况下,不需要在那里。任何属性都可以全局应用于FilterConfig.RegisterGlobalFilters中的所有控制器: filters.Add(新HandleErrorAttribute()) 也可以通过相关方法(即WebApiConfig.Register)对API控制器执行此操作
但是,如果您只需要显示一个简单的错误页面,只需使用customErrors即可。控制器中的代码在哪里?当第2行有一个空白的
返回时会发生什么?为什么要使用Response.Clear()?另外,如果要将[HandleError]属性应用于应用程序中的所有控制器,可以创建一个基本控制器,将[HandleError]属性应用于它,然后它们从基本控制器而不是默认控制器派生出所有控制器Hanks Gnomo,这应该是一个答案,而不是评论