【问题标题】:How do I create a global custom error page for ASP.NET MVC3?如何为 ASP.NET MVC3 创建全局自定义错误页面?
【发布时间】:2012-05-02 02:22:02
【问题描述】:

我是 ASP.NET MVC3 的新手。如何为 MVC3 创建全局自定义错误页面?一般的想法是,当抛出异常时,它会向用户显示一条通用消息,并将异常记录到数据库中,供开发人员稍后进行调查。

提前感谢您的帮助。

这是我最终在 global.asax.cs 中所做的:

    protected void Application_Error()
    {
        var exception = Server.GetLastError();

        Log.Error("Exception", exception);

        var httpException = exception as HttpException;
        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;
        Response.StatusCode = 500;
        if (httpException != null)
        {
            Response.StatusCode = httpException.GetHttpCode();
            switch (Response.StatusCode)
            {
                case 403:
                    routeData.Values["action"] = "Http403";
                    break;
                case 404:
                    routeData.Values["action"] = "Http404";
                    break;
            }
        }

        IController errorsController = new ErrorController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    在您的Global.asax 文件中实现Application_Error 方法:

        protected void Application_Error() { 
            HttpContext ctx = HttpContext.Current; 
            var error = ctx.Server.GetLastError();
            ctx.Response.Clear(); 
            ctx.Response.End(); 
        }
    

    跟进 Maess 的评论:

    阅读:Error Handling in asp.net mvc 3

    【讨论】:

    • 好点,但这只会处理未经处理的异常或 HTTP 错误,如 404、500 等。
    • @Maess:我添加了一些更具体的信息
    【解决方案2】:

    我在项目中所做的是创建了一个BaseController 并覆盖了OnException 事件,如下所示,

    protected override void OnException(ExceptionContext filterContext)
    {
        // do some logging using log4net or signal to ELMAH
        filterContext.ExceptionHandled = true;
        var exModel = new HandleErrorInfo(filterContext.Exception,  
                      filterContext.RouteData.Values["controller"].ToString(), 
                      filterContext.RouteData.Values["action"].ToString());
        View("Error", exModel).ExecuteResult(ControllerContext);
    }
    

    我还删除了Global.asax.cs 中注册的HandleError 操作过滤器。

    注意:您应该在共享文件夹中有一个名为 Error 的视图。

    更新:要从Error 视图中提取错误信息,您必须将Error 视图绑定到模型HandleErrorInfo

    @model System.Web.Mvc.HandleErrorInfo
    

    那么你就可以在视图中的任意位置轻松访问异常了

    @Model.Exception
    

    【讨论】:

    • 这真的很有趣。如何从视图中提取异常以便显示它?
    【解决方案3】:

    创建一个名为 Error 的视图并将其添加到您的 Views\Shared 文件夹中。然后在您的 catch 块中,在您记录错误后,将操作重定向到错误视图。如果您想显示复杂的消息,请创建一个错误模型并将其传递给视图,或者将信息放入 ViewBag。

    有关未处理的异常和 HTTP 错误的信息,请参阅 Ropstah 的帖子。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 2011-09-04
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多