jQuery ajax发布失败,但返回了正确的数据

时间:2011-11-09 23:08:23

标签: jquery asp.net-mvc ajax

抓住我的头。我正在尝试做一个简单的ajax表单帖子,我得到的响应是一个错误。但是,我的页面仍然显示我的JSON字符串作为响应。这是我的javascript块:

$(function () {
    $('#searchForm').submit(function () {
        var jqhxr = $.post({ url: this.action, type: this.method, data: $(this).serialize(), dataType: 'json' })
                     .done(function () { alert('success') })
                     .fail(function () { alert('fail') })
                     .always(function () { alert('complete') });
        return false;
    });
});

这是发布到ASP.NET MVC页面(虽然我不认为这是问题);路由是正确的,在调试器中被命中并返回正确的数据,但以防万一:

    [HttpPost]
    public JsonResult Search(SearchFormViewModel vm)
    {
        var products = _productRepo.Find(...);
        return Json(products);
    }

所以,会发生什么是表单是通过ajax提交的,因为它应该是,我得到'fail'警告框,但JSON字符串仍然显示,所以请求成功。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这真的是黑暗中的刺,但我想知道这是否会做你想做的事。

   $(function () {
        var jqhxr;     
        $('#searchForm').submit(function () {
            jqhxr = $.post({ url: this.action, 
                                type: this.method, 
                                data: $(this).serialize(), 
                                dataType: 'json',
                                success: function(data){ alert("success - data"); }
                        });                         
            jqhxr.done(function () { alert('success - done') });
            jqhxr.fail(function () { alert('fail') });
            jqhxr.always(function () { alert('complete') });
            return false;
        });
    });

基本上,我在这里所做的只是给了它一个成功的出路。

答案 1 :(得分:1)

好吧,我在这篇博文中找到了答案:http://blog.janjonas.net/2011-08-07/asp_net-mvc_3-jquery-ajax-submit-ajax-form-supporting-unobtrusive-client-side-validation-and-server-side-validation

唯一的区别是使用$('#searchForm')。live('submit',function(e){...});以及e.preventDefault();的使用,我认为这是关键。我没有阻止默认行为,这就是我在浏览器中看到JSON结果的原因。不解释为什么我收到“失败”警报,但我现在正在获得“成功”警报。所以我发布这个作为答案,因为它包含解决问题的信息的链接。希望这有助于未来的人们!

答案 2 :(得分:0)

尝试将$.post替换为$.ajax

$.ajax({    
    url: this.action, 
    type: this.method, 
    data: $(this).serialize(), 
    dataType: 'json' }
)
.done(function () { alert('success') })
.fail(function () { alert('fail') })
.always(function () { alert('complete') });