1. ホーム
  2. asp.net

[解決済み】ASP.NET MVC 4でカスタムエラーページを動作させる方法

2022-04-02 04:16:05

質問

500、404、403に対してカスタムエラーページを表示させたいのですが、どうすればいいですか?以下は、私が行ったことです。

  1. 以下のようにweb.configでカスタムエラーを有効にする。

    <customErrors mode="On" 
                  defaultRedirect="~/Views/Shared/Error.cshtml">
    
        <error statusCode="403" 
               redirect="~/Views/Shared/UnauthorizedAccess.cshtml" />
    
        <error statusCode="404" 
               redirect="~/Views/Shared/FileNotFound.cshtml" />
    
    </customErrors>
    
    
  2. 登録済み HandleErrorAttribute をグローバルアクションフィルタとして FilterConfig クラスは以下のようになります。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
    
    
  3. 上記の各メッセージに対応したカスタムエラーページを作成。500のためのデフォルトのものは、すでに箱から取り出して利用可能でした。

  4. 各カスタムエラーページのビューで、そのページのモデルを宣言します。 System.Web.Mvc.HandleErrorInfo

500の場合、カスタムエラーページが表示されます。それ以外の場合は表示されません。

何か見落としがあるのでしょうか?

のコードを読むと、カスタムエラーの表示方法はこれだけではなさそうです。 OnException メソッドの HandleErrorAttribute クラスで、500だけ処理しています。

他のエラーに対応するためにはどうしたらよいですか?

どのように解決するのですか?

私の現在のセットアップ(MVC3上ですが、まだ適用できると思います)は ErrorController を、使っています。

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error">
      <error redirect="~/Error/NotFound" statusCode="404" />
    </customErrors>
</system.web>

そして、コントローラの内容は以下の通りです。

public class ErrorController : Controller
{
    public ViewResult Index()
    {
        return View("Error");
    }
    public ViewResult NotFound()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View("NotFound");
    }
}

そして、ビューはあなたが実装したとおりのものです。しかし、私は、アプリケーションがデバッグモードである場合、スタックトレースとエラー情報を表示するために、ちょっとしたロジックを追加することが多い。なので、Error.cshtmlはこんな感じ。

@model System.Web.Mvc.HandleErrorInfo
@{
    Layout = "_Layout.cshtml";
    ViewBag.Title = "Error";
}
<div class="list-header clearfix">
    <span>Error</span>
</div>
<div class="list-sfs-holder">
    <div class="alert alert-error">
        An unexpected error has occurred. Please contact the system administrator.
    </div>
    @if (Model != null && HttpContext.Current.IsDebuggingEnabled)
    {
        <div>
            <p>
                <b>Exception:</b> @Model.Exception.Message<br />
                <b>Controller:</b> @Model.ControllerName<br />
                <b>Action:</b> @Model.ActionName
            </p>
            <div style="overflow:scroll">
                <pre>
                    @Model.Exception.StackTrace
                </pre>
            </div>
        </div>
    }
</div>