Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC jQuery AJAX调用动作方法太晚了?_Jquery_Asp.net Mvc_Ajax - Fatal编程技术网

ASP.NET MVC jQuery AJAX调用动作方法太晚了?

ASP.NET MVC jQuery AJAX调用动作方法太晚了?,jquery,asp.net-mvc,ajax,Jquery,Asp.net Mvc,Ajax,我在一个外部Javascript文件中有一些jQuery代码,该文件正在对控制器中的一个动作方法进行ajax调用。下面是外部Javascript文件中的代码。动作方法最终会被调用,但是它没有被及时调用。当我在action方法中设置断点时,直到submit按钮单击返回false之后,才会调用它。当EmailExist函数返回“isvalid”时,isvalid是未定义的 因此,最终调用action方法并不重要,只是因为EmailExist始终返回undefined,并且在返回按钮单击之前不会调用M

我在一个外部Javascript文件中有一些jQuery代码,该文件正在对控制器中的一个动作方法进行ajax调用。下面是外部Javascript文件中的代码。动作方法最终会被调用,但是它没有被及时调用。当我在action方法中设置断点时,直到submit按钮单击返回false之后,才会调用它。当EmailExist函数返回“isvalid”时,isvalid是未定义的

因此,最终调用action方法并不重要,只是因为EmailExist始终返回undefined,并且在返回按钮单击之前不会调用MVC action方法。有什么想法吗

行动方法:

        [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult EmailExist(string email)
    {
        Account account = _generalService.GetAccountByEmail(email);

        bool exist = false;
        if (account != null)
            exist = true;

            return Json(new { indb = exist });
    }
Javascript:

$(document).ready(function() {
$("input[type=submit]").click(function() {

    var valid = true;

    // email - check required and valid

    var email = $("input[name='email']");
    var emailtrim = jQuery.trim(email.val());

    // email exists in db ajax request
    if (EmailExist(emailtrim)) {
        valid = false;
    }

    return valid;
})

function EmailExist(emailval) {

    var isvalid;

    // hit db
    $.ajax(
    {
    type: "POST",
    url: "/Account/EmailExist",
    data: { 'email': emailval },
    success: function(result) {

        if (result.indb) {
            isvalid = true;

        }
    },
    error: function(error) {
        alert(error);
    }
});

    return isvalid;
}

}))

看起来您希望请求是同步的。要实现这一点,您需要将请求上的async选项设置为false。默认情况下,请求是异步的,以便在请求完成之前从ajax调用返回。或者,您可以重写代码,以便成功回调实际完成工作。后者对于AJAX更为惯用,但有时可能更为复杂

$.ajax(
    {
    type: "POST",
    async: false,              // <- note addition
    url: "/Account/EmailExist",
    data: { 'email': emailval },
    success: function(result) {

        if (result.indb) {
            isvalid = true;

        }
    },
    error: function(error) {
        alert(error);
    }
});

编辑:根据您的评论,您可能还想考虑使用jQuery作为解决所有验证需求的解决方案。

看来这并没有解决我的问题。这是否与外部JS文件中的调用有关?我在我的JS和ActionMethod中都设置了一个断点,ActionMethod直到所有剩余的JS代码都执行完毕后才被调用。还有什么想法吗?我添加了一个替代方案,如果电子邮件还不存在,可以使用ajax回调提交表单。太好了!但是问题是,我需要验证电子邮件,然后在脚本的后面继续进行更多验证。基本上,如果电子邮件不存在,它不应该只是提交表单。它应该翻转一个BoL,在JavaScript结束时,我返回true或false提交。我建议您可能想考虑使用jQuery验证插件:Marketo验证示例使用电子邮件地址的远程验证。
$("input[type=submit]").click(function() {

    // email - check required and valid

    var form = $(this).parent('form');
    var email = $("input[name='email']");
    var emailtrim = jQuery.trim(email.val());

    SubmitIfNoEmailExists(form,emailtrim);

    return false;
});

function SubmitIfNoEmailExists(form,emailval) {

    // hit db
    $.ajax({
        type: "POST",
        url: "/Account/EmailExist",
        data: { 'email': emailval },
        success: function(result) {
            if (!result.indb) {
               form.submit();
            }
        },
        error: function(error) {
            alert(error);
        }
    });
}