2012-04-20 5 views
2

私はASP.NET MVC3にまったく新しいものです。 MVC3のグローバルカスタムエラーページを作成するにはどうすればよいですか?一般的な考え方は、例外がスローされたときにユーザーに一般的なメッセージが表示され、開発者が後で調査するために例外をデータベースに記録するというものです。ASP.NET MVC3のグローバルカスタムエラーページを作成するにはどうすればよいですか?

ご協力いただきありがとうございます。 Maess'はコメントにフォローアップ

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

:あなたのGlobal.asaxファイルで

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

Application_Errorメソッドを実装します。ここでは

は、私がglobal.asax.csにやってしまったものです

これを読む:Error Handling in asp.net mvc 3

+0

良い点として、ビュー内のどこにでも例外にアクセスすることができ、それが唯一のunhanded例外またはHTTPエラーを処理しようとしている404のように、500など – Maess

+0

@Maess:私はいくつかの特定の情報を追加しました – Ropstah

0

エラーと呼ばれるビューを作成し、Views \ Sharedフォルダーに追加します。次に、catchブロックで、エラーをログに記録した後で、アクションをエラービューにリダイレクトします。高度なメッセージを表示する場合は、エラーモデルを作成してビューに渡したり、その情報をViewBagに入れます。

未処理の例外とHTTPエラーについては、Ropstahの投稿を参照してください。私は私のプロジェクトで何をやったか

1

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アクションフィルタを削除し、私は BaseControllerを作成し、以下のように OnExceptionイベントをオーバーライドしています。

注:共有フォルダには、名前がErrorのビューが必要です。

更新:Errorビューからエラー情報を抽出するには、ビューをモデルHandleErrorInfoにバインドする必要があります。

@model System.Web.Mvc.HandleErrorInfo 

は、その後、あなたが簡単に

@Model.Exception 
+0

これは本当に面白いです。どのように私はそれを表示することができますビューから例外を抽出するのですか? –

+0

@Greg回答を更新しました – VJAI