0

asp.netmvc3Webサイトのエラーページをカスタムしたい。

だから、私はこの非常に便利な投稿を見つけました:asp.netMVC3のカスタムエラーページとそれはうまく機能します

ただし、私のHttp404.cshtmlファイルはViewsデフォルトのフォルダにありません。。という名前のフォルダにありますBaseViews。そのフォルダには、自分_Layout.cshtmlと他のビューまたは部分的なビューがすでにあります。

このフォルダはデフォルトではチェックされていません(フォルダとmyのすべてのフォルダViewEngineのみをチェックします)。そこで、ViewEngineExtensionを使用して、のコレクションに追加します。私のアプリケーションはすべて完全に正常に動作し、レイアウトやその他のものにアクセスできます。ViewsviewsAreasSystem.Web.Mvc.ViewEnginesGlobal.asaxApplication_Start()BaseViews

Global.asax'sについても同じことは言えませんApplication_Error()。このメソッドは、以前のビューエンジンを無視し、デフォルトのビューフォルダーのみを調べます。Application_Error()このようにViewEngineExtensionをメソッドに追加しようとしましたViewEngines.Engines.Add(new BaseViewsEngineExtension());が、何も変更されません。で使用しているのとまったく同じ行ですApplication_Start()

:については私のコードを参照してApplication_Error()ください

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error";
    routeData.Values["action"] = "Index";
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
    if (httpException != null)
    {
        Response.StatusCode = httpException.GetHttpCode();
        switch (Response.StatusCode)
        {
            case 404:
                routeData.Values["action"] = "Http404";
                break;
        }
    }

    IController errorController = new ErrorController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorController.Execute(rc);
}

私の質問は次のとおりです。ビューエンジンにフォルダ内errorController.Excecute(rc)のHttp404.cshtmlビューを検索させるにはどうすればよいですか?BaseViews

4

2 に答える 2

0

Http404ビューへのフル パスを返すようにアクションを変更します。

于 2012-08-01T18:14:53.953 に答える
0

SLaks が言ったように、ビューのフル パスを ErrorController に返す必要があります。

  public class ErrorController : Controller
  {
      public ActionResult Http404()
      {
          return View("~/BaseViews/Error/Http404.cshtml");
      }
  }

ただし、エラーがオーバーライドされているため機能しないため、期待どおりの結果が得られません。この問題を回避するには、次のようにして application_error ですべて問題ないことをアプリケーションに伝えることができます。

Request.StatusCode = 200;

問題が解決することを願っています。

于 2012-08-02T10:11:23.240 に答える