5

ここに投稿されたブログとSOに関するトピックを使用して、すべてのエラーページを処理するコントローラーを作成しました。

私の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");
        }

    }

そして、私のRazor Viewには、以下のhtmlの一部しか含まれていません。

@{
    ViewBag.Title = "404";
}

<h2>404</h2>

This is a 404 page!

リターンコンテンツを使用すると、404ページを見ていることを示すプレーンなテキスト出力が表示されます。ただし、404ページをデザインの残りの部分に合わせたいので、独自のビューを使用します。ただし、Return Viewを使用するとすぐに、空白のページが表示されます。私は非常に明白な何かを見逃していると思いますが、私はそれを見ていません。

4

2 に答える 2

4

私は同じ問題を抱えていましたが、最終的に私に合った解決策を見つけました。行にブレークポイントを配置し、errorsController.Execute(rc);この例外に遭遇するまで「ステップイン」を使用したときにブレークスルーが発生しました。

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 メソッド内で発生していて、設定したためだと思いResponse.TrySkipIisCustomErrors = trueます。

このエラーを見た後、私の問題は単に名前の不一致の 1 つであることにすぐに気付きましErrorControllerErrorsController。私にとっての問題は、私が設定したことでしrouteData.Values["controller"] = "Errors";た。これは間違っています。に切り替えるとrouteData.Values["controller"] = "Error";、問題が修正されました。

コントローラーを直接インスタンス化するため、すぐにエラーをキャッチできないことに注意してください。また、その部分のスペルが間違っているとコンパイルされません。ただし、コントローラ内で View() を呼び出すと、RouteData作成してオブジェクトに渡したインスタンスを使用してビューが検索されRequestContextます。そのため、コントローラー名のスペルが間違っていると、MVC はビューを探す場所を認識できず、IIS カスタム エラーがスキップされるため、黙って失敗します。

簡単に言えば、コントローラーとビューの名前を確認してください。コントローラー名は正しいが、ビューのファイル名が一致しない場合、同様のことが起こると思います。

于 2012-09-28T05:57:44.847 に答える
-1

これをチェックしてください。これは、mvc で例外処理を実装する最良の方法です。

同じ例外処理を実装しましたが、いくつかの問題に直面していますが、それでもこれを参照できます

于 2012-07-03T19:57:18.630 に答える