5

webconfigでカスタムエラーをオンにして、「/ Error/Trouble」にリダイレクトしています。これは設計どおりに機能しています。Elmahはエラーをログに記録しています。エラービューも表示されています。

問題は、エラーコントローラーのトラブルアクションでスローされたエラーを検査したいということです。エラーがスローされた場合、MVCがカスタムエラーハンドラーにリダイレクトした後、どのようにしてエラーにアクセスしますか?

CurrentUserがnullの場合、例外をスローします。

        if (CurrentUser == null)
        {
            var message = String.Format("{0} is not known.  Please contact your administrator.", context.HttpContext.User.Identity.Name);
            throw new Exception(message, new Exception("Inner Exception"));
        }

カスタムエラーハンドラ(「エラー/トラブル」)でこれにアクセスできるようにしたい。例外にどのようにアクセスしますか?

これが私のトラブルアクションです:

    public ActionResult Trouble()
    {
        return View("Error");
    }

これが私の見解です:

@model System.Web.Mvc.HandleErrorInfo

<h2>
    Sorry, an error occurred while processing your request.
</h2>
@if (Model != null)
{
    <p>@Model.Exception.Message</p>
    <p>@Model.Exception.GetType().Name<br />
    thrown in @Model.ControllerName @Model.ActionName</p>
    <p>Error Details:</p>
    <p>@Model.Exception.Message</p>
}

System.Web.Mvc.HandleErrorInfoは、私のトラブルビューのモデルであり、空です。ご協力いただきありがとうございます。

4

1 に答える 1

2

回避策を見つけました:

Global.asaxで私はこれを行います:

        protected void Application_Error()
    {
        var exception = Server.GetLastError();

        HttpContext.Current.Application.Lock();
        HttpContext.Current.Application["TheException"] = exception;
        HttpContext.Current.Application.UnLock();
    }

エラー/トラブルで私はこれを行います:

        var caughtException = (Exception)HttpContext.Application["TheException"];
        var message = (caughtException!= null) ? caughtException.Message : "Ooops, something unexpected happened.  Please contact your system administrator";
        var ex = new Exception(message);
        var errorInfo = new HandleErrorInfo(ex, "Application", "Trouble");
        return View("Error", errorInfo);

これは機能しています。しかし、それは奇妙な方法のようです。誰かがより良い解決策を持っていますか?ご協力いただきありがとうございます。

于 2012-05-11T20:28:04.183 に答える