MVC のエラー処理について理解しようとしています。私が探しているのは、エラーをキャッチし、ログに記録し、可能であれば解決し、必要に応じて他のアクションを実行し、最終的に正しいビューをユーザーに表示する集中型の方法です。
これには [HandleError] フィルターを使用できると思いますが、コントローラー/アクションにルーティングする方法がわかりません。私が見る唯一のオプションは、それを直接ビューに向けることです。
MVC のエラー処理について理解しようとしています。私が探しているのは、エラーをキャッチし、ログに記録し、可能であれば解決し、必要に応じて他のアクションを実行し、最終的に正しいビューをユーザーに表示する集中型の方法です。
これには [HandleError] フィルターを使用できると思いますが、コントローラー/アクションにルーティングする方法がわかりません。私が見る唯一のオプションは、それを直接ビューに向けることです。
MVC に付属するHandleErrorAttributeは、かなり基本的な IExceptionFilter です。
あなたが望むと思うものを達成するためのいくつかのオプションがあります。
アクション/コントローラーで [HandleError (Type=typeof(MyException),View="ErrorView")] を使用するか、独自のものを実装することができます
HandleErrorAttributeはそれほど複雑ではありません。MS は、このコードをコピーして、要件に合わせて変更することをお勧めします。
OnException オーバーライドを使用すると、必要なすべての情報 (コントローラー、アクション、ルート データなど) に ExceptionContext を介してアクセスできます。
ExceptionHandled を忘れずに設定してください。次に、filterContext.Result を新しい RedirectToAction インスタンスに設定して、ErrorController とアクションにリダイレクトできます。明らかに、特定のコントローラーとアクションをプロパティで公開できます。
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
ActionResult から派生した独自の ErrorResult を作成してみませんか?
私がやっていること(これは良い習慣かもしれませんし、そうでないかもしれません)はこれです:
エラーが発生した場合:
私の一般的なエラー処理のほとんどは、すべてのコントローラーの基本クラスに含まれています。唯一の問題は、エラー ページでリダイレクト用の ActionLink を生成できるように、基本クラスでコントローラーとアクションの値を手動で設定する必要があることです。