1. ホーム
  2. asp.net-mvc-3

[解決済み] asp.net MVC3 のカスタムエラーページ

2022-05-11 19:40:12

質問

MVC3 ベースのウェブサイトを開発しており、エラーを処理し、エラーの種類ごとにカスタム ビューをレンダリングするためのソリューションを探しています。主なアクションが "Index" (一般的なエラーページ) で、このコントローラは "Handle500" や "HandleActionNotFound" などのユーザーに表示されるエラー用のいくつかのアクションを持っていると想像してください。

つまり、ウェブサイト上で起こりうるすべてのエラーは、この "Error"コントローラによって処理されます(例:"Controller" または "Action" not found、500、404、dbException など)。

サイトマップファイルを使用して、ウェブサイトのパスを定義しています(ルートではありません)。

この質問はすでに回答されました。これはGweebzへの返信です。

私の最終的なapplicaiton_errorメソッドは次のとおりです。

protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
    Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
    try
    {
        var exception = Server.GetLastError();

        Log.Logger.Error("unhandled exception: ", exception);

        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Errors";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;

        IController errorsController = new ErrorsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }
    catch (Exception e)
    {
        //if Error controller failed for same reason, we will display static HTML error page
        Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
        Response.TransmitFile("~/error.html");
    }
}
}

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

カスタムエラーの処理方法の一例です。私は ErrorsController を定義し、異なる HTTP エラーを処理するアクションを追加しています。

public class ErrorsController : Controller
{
    public ActionResult General(Exception exception)
    {
        return Content("General failure", "text/plain");
    }

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

    public ActionResult Http403()
    {
        return Content("Forbidden", "text/plain");
    }
}

をサブスクライブし、その後に Application_ErrorGlobal.asax を作成し、このコントローラを呼び出します。

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Errors";
    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 ErrorsController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorsController.Execute(rc);
}