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

[解決済み] ASP.NET MVC Ajaxのエラー処理について

2022-09-28 16:41:22

質問

jquery ajax がアクションを呼び出したときに、コントローラで発生する例外をどのように処理すればよいのでしょうか?

例えば、デバッグモードまたは通常のエラーメッセージの場合、例外メッセージを表示するajax呼び出し中のあらゆる種類のサーバー例外に実行されるグローバルjavascriptコードが欲しいです。

クライアント側で、私はajaxエラーで関数を呼び出します。

サーバー側では、カスタムアクションフィルタを書く必要がありますか?

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

サーバーが200以外のステータスコードを送信した場合、エラーコールバックが実行されます。

$.ajax({
    url: '/foo',
    success: function(result) {
        alert('yeap');
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('oops, something bad happened');
    }
});

で、グローバルなエラーハンドラを登録する場合は $.ajaxSetup() メソッドを使用します。

$.ajaxSetup({
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('oops, something bad happened');
    }
});

もう一つの方法は、JSONを使うことです。つまり、例外をキャッチしてJSONレスポンスに変換する、サーバー上のカスタムアクションフィルタを書くことができます。

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new { success = false, error = filterContext.Exception.ToString() },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}

という属性で、コントローラのアクションを装飾します。

[MyErrorHandler]
public ActionResult Foo(string id)
{
    if (string.IsNullOrEmpty(id))
    {
        throw new Exception("oh no");
    }
    return Json(new { success = true });
}

を実行し、最後にそれを起動します。

$.getJSON('/home/foo', { id: null }, function (result) {
    if (!result.success) {
        alert(result.error);
    } else {
        // handle the success
    }
});