2012-07-03 15 views
5

hereとトピックhereを投稿したブログを使用していますので、すべてのエラーページを処理するコントローラを作成しました。MVC3カスタムエラーページは空白の結果を返します

は私のGlobal.asax.csでは、私は次のコードを持っている:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      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; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

私のErrorControllerは次のようになります。

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

そして、私のレイザー見るだけの作品が含まれています下のhtml;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

私はReturn Contentを使用すると、私は404ページを見ていると言っているプレーンテキスト出力を取得しています。しかし、私は404ページを残りのデザインに合わせたいので、自分のビューを使用したいと思います。しかし、私はリターンビューを使用するとすぐに私は空白のページを取得しています。私は非常に明白な何かを見逃していると思うが、私はそれを見ない。

+0

この全く同じことが、私のコードをモデル化した投稿まで、私に起こっています。 –

+0

まったく同じことが私に起こっています。あなたはこの問題の解決策を見つけましたか? –

答えて

4

私は同じ問題を抱えていましたが、最終的に私のために働く解決策を見つけました。

例外が飲み込まれた
The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

、それはのApplication_Errorメソッドの内部で起こっていたので、私は仮定して:私はerrorsController.Execute(rc);行にブレークポイントを配置し、「へのステップ」を使用したとき、私はこの例外に出くわしたまでブレークスルーが来ました私はResponse.TrySkipIisCustomErrors = trueを設定していたからです。

このエラーが表示された後、私はすぐに私の問題が単に不一致の名前の1つであることを認識しました:私のコントローラは実際にErrorControllerといい、ErrorsControllerではありません。私の問題は、私がrouteData.Values["controller"] = "Errors";を設定していたことです。これは間違っています。 routeData.Values["controller"] = "Error";に切り替えて問題を修正しました。

コントローラを直接インスタンシエートするため、すぐにエラーをキャッチしないように注意してください。間違っているとエラーが発生した場合はコンパイルされません。しかし、コントローラの内部で、View()を呼び出すと、RequestContextオブジェクトに構築されて渡されたRouteDataインスタンスを使用してビューが検索されます。したがって、コントローラの名前のスペルが間違っていると、MVCはビューの検索場所を知らず、IISのカスタムエラーはスキップされるため、静かに失敗します。

短いストーリー:コントローラとビュー名を確認してください。私はコントローラ名が正しいが、ビューのファイル名が一致しない場合、同様のことが起こると仮定します。

+0

解決策が見つかりませんでした。ご回答いただきありがとうございます。非常に論理的だと思われる。できるだけ早くこれを試してみましょう。 – Rob

+0

どのように愚か!名前を「エラー」から「エラー」に変更してから、すべてをデバッグすることができました。私はまだ白いページを手に入れていたことに気付きました。しかし、すべてを行き来した後、私は理解できた例外を見ました。それを解決するとすべてが動作します。 – Rob

0

thisをご覧ください。 mvcで例外処理を実装する最善の方法です。

私は同じ例外処理を実装しましたが、いくつかの問題に直面していますが、まだthisを参照することができます。

+0

昨夜試しましたが、残念ながら問題は解決しませんでした(まだ)他の提案は大歓迎です! – Rob

関連する問題