MVC4 jQuery AJAX回发永远不会遇到控制器动作

时间:2016-08-05 00:21:08

标签: jquery ajax asp.net-mvc-4

我有一些jQuery脚本使用AJAX回发到控制器,但控制器永远不会被命中。我的AJAX调用出现了某种错误,但它过得太快而我无法读取它。

我的AJAX:

function ValidateByBASFID(basfID) {
    $.ajax({
        url: 'AJAX/ValidateByBASFID',
        data: '{"BASFID":"' + basfID + '"}',
        type: 'POST',
        dataType: 'json',
        success: function (result) {
            if (result)
                return true;
            else {
                $("#txtBASFIDError").html("Invalid BASF ID");
                return false;
            };
        },
        error: function (result) {
            alert("An error occured. \nStatus: " + result.status
                            + "\nStatus Text: " + result.statusText
                            + "\nError Result: " + result);
        }
    });
};

我的控制器:

namespace Section_Signup.Controllers
{
    public class AJAXController : Controller
    {
        [HttpPost]
        public JsonResult ValidateByBASFID(string BASFID)
        {
            Models.Repositories.SectionRepository _repository = new Models.Repositories.SectionRepository();
            MemberVM Member = _repository.GetMemberByBASFID(BASFID);

            if (Member != null)
                return Json(true);
            else
                return Json(false);
        }
    }
}

当我在控制器动作中设置一个断点时,它永远不会被击中。

1 个答案:

答案 0 :(得分:0)

事实证明问题在于AJAX的异步性质。我将我的AJAX回调连接到提交按钮并尝试验证ID。如果它无效,我将返回false以取消"取消"提交。

问题是脚本不会等待答案回来并在进行AJAX调用后直接提交表单。如果它随后回来是假的,那就太晚了,它会抛出奇怪的错误。

我已将我的AJAX改为:

function ValidateByBASFID(basfID) {
    $.ajax({
        url: 'AJAX/ValidateByBASFID',
        data: { BASFID: basfID },
        type: 'POST',
        dataType: 'json',
        success: function (result) {
            if (result)
                $('form#formBASFID').submit();
            else {
                $("#txtBASFIDError").html("Invalid BASF ID");
            }
        },
        error: function (result) {
            alert("An error occured. \nStatus: " + result.status
                            + "\nStatus Text: " + result.statusText
                            + "\nError Result: " + result);
        }
    });
};

每次取消提交时,调用此AJAX回调的函数都会向提交返回false。它看起来像这样:

$("#btnBASFID").click(function () {
    var basfID = $("#txtBASFID").val();
    ValidateByBASFID(basfID);
    return false;
});

如果随后此AJAX返回ID有效,则再次处理提交。