【问题标题】:ASP.NET MVC jQuery AJAX Calls Action Method too late?ASP.NET MVC jQuery AJAX 调用 Action 方法为时已晚?
【发布时间】:2009-03-21 15:32:56
【问题描述】:

我在一个外部 Javascript 文件中有一些 jQuery 代码,它正在对我的控制器中的操作方法进行 ajax 调用。外部 Javascript 文件中的代码如下。 action 方法最终被调用,但是它没有被及时调用。当我在操作方法中设置断点时,直到提交按钮单击返回 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;
}

});

【问题讨论】:

    标签: jquery asp.net-mvc ajax


    【解决方案1】:

    看起来您希望请求是同步的。要实现这一点,您需要将请求上的 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);
        }
    });
    

    $("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);
            }
        });
    }
    

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

    【讨论】:

    • 看来这并没有解决我的问题。无论如何,这可能与外部 JS 文件中的调用有关吗?我在我的 JS 和 ActionMethod 中都设置了一个断点,并且直到所有其余的 JS 代码都已执行之后才会调用 ActionMethd。还有什么想法吗?
    • 我添加了一个替代方案,如果电子邮件不存在,则使用 ajax 回调提交表单。
    • 太棒了!但是问题出在这里,我需要验证电子邮件,然后在脚本后面继续进行更多验证。本质上,如果电子邮件不存在,则不应只提交表单。它应该翻转一个布尔值,在 javascript 的末尾我要么返回 true 要么 false 提交。
    • 我建议您可能要考虑使用 jQuery 验证插件:plugins.jquery.com/project/validate。 Marketo 验证示例使用电子邮件地址的远程验证。
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多