6

MVC のエラー処理について理解しようとしています。私が探しているのは、エラーをキャッチし、ログに記録し、可能であれば解決し、必要に応じて他のアクションを実行し、最終的に正しいビューをユーザーに表示する集中型の方法です。

これには [HandleError] フィルターを使用できると思いますが、コントローラー/アクションにルーティングする方法がわかりません。私が見る唯一のオプションは、それを直接ビューに向けることです。

4

4 に答える 4

4

MVC に付属するHandleErrorAttributeは、かなり基本的な IExceptionFilter です。

あなたが望むと思うものを達成するためのいくつかのオプションがあります。

アクション/コントローラーで [HandleError (Type=typeof(MyException),View="ErrorView")] を使用するか、独自のものを実装することができます

HandleErrorAttributeはそれほど複雑ではありません。MS は、このコードをコピーして、要件に合わせて変更することをお勧めします。

OnException オーバーライドを使用すると、必要なすべての情報 (コントローラー、アクション、ルート データなど) に ExceptionContext を介してアクセスできます。

ExceptionHandled を忘れずに設定してください。次に、filterContext.Result を新​​しい RedirectToAction インスタンスに設定して、ErrorController とアクションにリダイレクトできます。明らかに、特定のコントローラーとアクションをプロパティで公開できます。

于 2008-10-13T12:41:57.307 に答える
2

Leppi, iAction Result に送信したい場合は、エラー時にリダイレクトする Action と Controller を定義できます。これは良い例ですが、個人的には、コードにカスタム ページや http コードを使用しないのは好きではありません。

これが私の IExtenptionFilter の例です。私の基本コントローラーには、制御されていないすべてのエラーを処理するためのデフォルトの IExceptionFilter があります。

[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
    Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class GenericExceptionHandlerFilter : ActionFilterAttribute, IExceptionFilter
{

    public Type ExceptionType { get; set;}
    public string RedirectToAction { get; set;}
    public string RedirectToController { get; set;}

    protected bool ApplyFilter(ExceptionContext filterContext)
    {
        Type lExceptionType = filterContext.Exception.GetType();
        return (ExceptionType == null ||
                lExceptionType.Equals(ExceptionType));
    }


    #region IExceptionFilter Members
    public void OnException(ExceptionContext filterContext)
    {

        if (ApplyFilter(filterContext))
        {
            IbfControllerLogger.Log(filterContext.Exception);

            filterContext.ExceptionHandled = true;

            #region Calculate Action Controller Error
            RouteValueDictionary lRoutes = new RouteValueDictionary(new
                {
                    action = RedirectToAction,
                    controller = String.IsNullOrEmpty(RedirectToController) ? (string)filterContext.RouteData.Values["controller"] : RedirectToController
                });
            UrlReWriterUtils.UrlReWriter(filterContext.Controller.ViewData, lRoutes);
            #endregion

            filterContext.Controller.TempData[TempDataName.C_TEMPDATA_EXCEPTIONERROR] = filterContext.Exception;
            filterContext.Result = new RedirectToRouteResult(lRoutes);
        }
    }
    #endregion
于 2009-04-16T14:40:07.977 に答える
1

ActionResult から派生した独自の ErrorResult を作成してみませんか?

于 2008-10-13T12:34:43.873 に答える
0

私がやっていること(これは良い習慣かもしれませんし、そうでないかもしれません)はこれです:

エラーが発生した場合:

  • 私がそれを期待し、それを処理できる場合、私はそうします(ELMAHでログを記録しています)
  • 予期していたのに処理できない場合は、ELMAH にログを記録し、エラー ページである ViewResult を返します。
    • エラーの説明、標準メッセージ、および行っていたことへのリンクを含めます
  • 予期していなかった場合は、ベース コントローラー クラスの OnError のオーバーライドが前の手順を実行します。
  • 処理できない他のすべてのエラーは、ELMAH によって自動的にログに記録され、リクエストのイエロースクリーンが表示されます。

私の一般的なエラー処理のほとんどは、すべてのコントローラーの基本クラスに含まれています。唯一の問題は、エラー ページでリダイレクト用の ActionLink を生成できるように、基本クラスでコントローラーとアクションの値を手動で設定する必要があることです。

于 2008-10-13T13:26:55.233 に答える