【问题标题】:MVC HandleError vs customErrors tagMVC HandleError 与 customErrors 标签
【发布时间】:2010-10-06 15:41:19
【问题描述】:

因此,如果我正确理解 [HandleError] (see here) 您必须将其添加到要处理错误的每个控制器中。

将错误页面的路径添加到 web.config customErrors 标记中似乎要容易得多:

<customErrors mode="On" defaultRedirect="~/Error/Index" >
</customErrors>

在什么情况下使用 [HandleError] 会比这更好?

【问题讨论】:

  • 此外,如果您想将 [HandleError] 属性应用于应用程序中的所有控制器,您可以创建一个基本控制器,将 [HandleError] 属性应用于它,它们会从您的基本控制器派生所有控制器控制器而不是默认控制器
  • 感谢 Gnomo,这应该是一个答案而不是评论

标签: asp.net-mvc error-handling


【解决方案1】:

[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,以便向用户显示错误消息。这只是一个示例,但您可以做任何您需要的事情。在这里,我通过继承FilterAttribute 并实现IExceptionFilter 来创建自己的[HandleError] 属性。你可以看到我在这里得到的那种力量。我实现了自己的属性来处理我的要求。但是您可以通过使用内置的[HandleError] 来实现类似的结果。

行号的目的。 2 是处理链中其他人已经处理异常的情况。那么在这种情况下,您可能没有兴趣再次处理它。 Response.Clear() 是在我将用户重定向到新页面之前清除管道。在你的情况下没有必要在那里。

【讨论】:

  • 这段代码在哪里,在控制器中?当您在第 2 行中有一个空白 return 时会发生什么?为什么要使用 Response.Clear()?
【解决方案2】:

任何属性都可以在 FilterConfig.RegisterGlobalFilters 中全局应用于所有控制器: filters.Add(new HandleErrorAttribute());

也可以在相关方法中为API控制器完成,即WebApiConfig.Register。

但是,如果您只需要显示一个简单的错误页面,只需使用 customErrors。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2010-10-11
    • 2011-07-01
    • 2015-09-15
    • 2010-10-01
    • 2017-03-16
    相关资源
    最近更新 更多