jquery事件preventDefault()不起作用

时间:2012-04-19 15:22:59

标签: jquery asp.net-mvc preventdefault

我使用MVC并希望通过jquery提交表单,但是对于mvc内置验证在任何无效输入的情况下工作,我已经条件化了click事件的“return false”(也尝试了“ event.preventDefault“),如果从控制器获得”成功“json返回。

以下是代码:

$(document).ready(function () {
    var request;
    $('#formSubmit').click(function (event) {
        request = $.ajax({
            url: '/personManager/loadDetails/',
            type: 'post',
            data: $('form').serialize()
        });
        request.done(function(data){
            if(data=="success")
                event.preventDefault();
            });

        });
    });

我不能让它发挥作用...... 我做错了什么? 还有,有没有更有效的方法来保存mvc验证机制,同时使用jquery?

更新:如果我尝试更简单地描述我的愿望:我想调整click事件的preventDefault,所以在某种情况下它将调用表单提交,而在其他情况下,它不会,只有$ .ajax工作。 在我在服务器端确认没有发生任何动作之后,第二个是有效的。 我猜必须有办法......

3 个答案:

答案 0 :(得分:6)

问题很可能是因为你的ajax是异步的。将它设置为同步,您的代码应该可以正常工作。但请注意,如果服务器无法立即响应,您可能会冒着用户浏览器冻结的风险。

答案 1 :(得分:1)

上周我遇到了类似的问题。您需要在async:false功能上设置$.ajax。您的默认事件可能在ajax响应有机会阻止此操作之前运行。这是因为AJAX以异步方式运行。设置async:false可以防止这种情况发生。但正如@Kolink指出的那样,这意味着如果响应失败,您的页面可能会冻结。

$(document).ready(function (e) {
    var request;
    var preventDefault = false;
    $('#formSubmit').click(function (event) {
        request = $.ajax({
            url: '/personManager/loadDetails/',
            type: 'post',
            data: $('form').serialize()
            , async: false
        });
        request.done(function (data) {
            if (data == "success")
                preventDefault = true;
        });

        if (preventDefault){
           e.preventDefault();
        }

    });
});

答案 2 :(得分:0)

为什么不使用,jQuery验证?您需要服务器端特定验证吗? 我意识到您已经在使用内置验证的mvc,但由于您使用jQuery提交表单,因此您可以使用它进行验证。只是一个建议,因为你可以这样做:

$(document).ready(function () {
    $('form').validate({
        rules: {},
        messages: {}
    });
    var request;
    $('#formSubmit').click(function (event) {
            if($('form').valid()){
                request = $.ajax({
                    url: '/personManager/loadDetails/',
                    type: 'post',
                    data: $('form').serialize()
                });
                request.done(function(data){
                    if(data=="success")
                        event.preventDefault();
                    });                     
            }

        });
    });