1

HandleErrorAttributeAjax リクエスト中に発生した例外を処理する独自の属性を作成することで、MVCを拡張しました。その属性は次のとおりです。

public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute
{
    public string PartialViewName { get; set; }

    public override void OnException(ExceptionContext filterContext)
    {
        ExceptionHelper.HandleException(filterContext.Exception, false); // custom static class and method
        base.OnException(filterContext);

        // Use partial view in case of AJAX request
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = new PartialViewResult {ViewName = PartialViewName ?? "~/Views/Errors/DefaultAjaxError.cshtml"};
            filterContext.Result = result;
        }
    }
}

PartialViewNameご覧のとおり、が nullの場合にはデフォルトの動作があります。これは、Global.asax ファイルにグローバル フィルターとして登録しているためです。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AjaxAwareHandleErrorAttribute());
}

このように設定すると、Ajax 呼び出し中に例外が発生した場合のデフォルトの動作、つまり DefaultAjaxError.cshtml が返されます。カスタム メッセージが必要な場合は、ビューを作成しPartialViewName、次のようにアクションの属性に直接渡します。

[AjaxAwareHandleError(PartialViewName = "~/Views/Errors/CustomAjaxError.cshtml")]
public ActionResult SomeAjaxControllerAction()

コントローラー アクションで装飾されたコントローラーがある場合の問題はAjaxAwareHandleErrorAttribute、おそらくグローバルに登録されているため、またメソッド上にあるため、クラス内のコードが 2 回実行されていることです。2回実行されないようにする方法はありますか?

ありがとう。

4

1 に答える 1

0

filterContext.ExceptionHandledプロパティを true に設定します。

次に、オーバーライドの先頭で、そのプロパティが true かどうかを確認し、すぐに戻ります。

于 2013-02-15T19:40:05.073 に答える