2012-04-20 57 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

相關問題