2012-04-20 106 views
2

我是ASP.NET MVC3的新手。我将如何为MVC3创建全局自定义错误页面?总体思路是,当抛出异常时,它会向用户显示一条通用消息,并将异常记录到数据库供开发人员稍后调查。如何为ASP.NET 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); 
    } 

回答

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

+0

好一点,但只会处理unhanded异常或HTTP错误像404,500等 – Maess 2012-04-20 13:33:33

+0

@Maess:我已经添加了一些更具体的信息 – Ropstah 2012-04-20 13:34:46

0

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

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

1

我已经在我的项目做什么是我创建了一个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 
+0

这真的很有趣。如何从视图中提取异常,以便我可以显示它? – 2012-04-20 13:58:57

+0

@Greg我更新了答案 – VJAI 2012-04-21 05:58:24