2

私のMVCレイアウトページには次のものがあります:

$("body").ajaxError(
    function (e, request) {
        if (request.status == 403 || request.status == 500) {
            window.location = '@Url.Action("LogOn", "Account", new {area = "", msg = "forbidden", returnUrl = HttpContext.Current.Request.RawUrl})' + window.location.hash;
        return;
        }
        window.location = '@Url.Action("Index", "Error")';
    }
);

別のページで、次のように ajax 呼び出しを実行しています。

...
                $.when(refreshActionLinks(row, machineId, packageId)).done(function(a1) {
                    row.find("span").text(opStatus).removeClass("pending");
                    progressbar.progressbar("destroy");
                    $(row).flash(bg[1], 1000);
                });
...

JavaScript 関数:

function refreshActionLinks($row, machineId, packageId) {
    try {
        var json = JSON.stringify({ packageId: packageId, machineId: machineId, tabType: $("#TabType").val() });
        console.log("refreshActionLinks => " + json);
        $row.find("td.options div.actionLinks").html("<img src='@Url.Content("~/Content/images/ajax-load2.gif")' />"); // pending
        return $.ajax({
            url: "@Url.Action("GetActionLinks", "Packages")",
            data: json,
            timeout: 50000,
            contentType: 'application/json',
            type: 'POST',
            success: function (data) {
                if ($row.length) {
                    $row.find("td.options div.actionLinks").html(data);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log(textStatus, errorThrown);
            }
        });
    } catch(e) {
        // hide icons
        $row.find("a.action").remove();
    } 
}

問題は、refreshAction 関数の実行中にメニュー リンクをクリックすると、ajax 呼び出しでエラーが発生することです。この場合は正しいです。しかし、正しくない /Index/Error ページに移動します。「$("body").ajaxError」で、refreshActionLinks を呼び出しているページを除いて、サイト上のすべての ajax エラーを処理したいと考えています。注意してください、私はすでに ajax 呼び出しを囲む try/catch を持っています。なぜそれがうまくいかないのですか?

ありがとう

4

1 に答える 1

0

理解した:

ajaxには設定があります:

global: false

今私の関数は次のようになります:

function refreshActionLinks($row, machineId, packageId) {
    try {
        var json = JSON.stringify({ packageId: packageId, machineId: machineId, tabType: $("#TabType").val() });
        console.log("refreshActionLinks => " + json);
        $row.find("td.options div.actionLinks").html("<img src='@Url.Content("~/Content/images/ajax-load2.gif")' />"); // pending
        return $.ajax({
            url: "@Url.Action("GetActionLinks", "Packages")",
            global: false, // disable error pages on failed ajax calls
            data: json,
            timeout: 50000,
            contentType: 'application/json',
            type: 'POST',
            success: function (data) {
                if ($row.length) {
                    $row.find("td.options div.actionLinks").html(data);
                }
            }
        });
    } catch(e) {
        // hide icons
        $row.find("a.action").remove();
    } 
}
于 2013-03-13T08:11:38.353 に答える