某些浏览器中ASP.NET MVC的JSON响应问题

时间:2010-10-08 21:07:06

标签: jquery json asp.net-mvc-2 forms

我正在使用jQuery的表单插件(如许多线程中所建议的那样,如this one)来向.NET MVC控制器发布Ajax帖子并使用我回来的JSON。它在Chrome中运行得很好,但在其他一些浏览器中,包括Firefox 3,表单提交会导致“保存或打开此文件”对话框。 JavaScript看起来像:

var options = {
            dataType: "json",
            clearForm: true,
            beforeSubmit: hideUpdateField,
            success: handleNewsPostSuccess
        };

        $('div#Updates form').ajaxForm(options);
控制器响应的主要内容是:

Object response = new { html = RenderPartialViewToString("DisplayNewsPost", np), newpoints = points.ToString() };
return Json(response, "application/json; charset=utf-8");

我错过了什么?这就像提交事件没有附加在Firefox和其他问题浏览器中。我尝试使用ajaxSubmit创建自己的提交操作,而不是返回false,但没有区别。

3 个答案:

答案 0 :(得分:2)

使用不同的MIME类型进行响应;简单text/plain应该有效。我认为FF被未知的application/* MIME类型搞糊涂,因此假设它是一些特定于应用程序的数据,最好作为单独的文件下载。

或者,您可以试用Content-Disposition标题,将其设置为inline。 Firefox应该遵守它,但是IIRC在IE上可能存在一些问题。

答案 1 :(得分:0)

我不确定你是否遇到了同样的问题,但this question and answers可能对你有所帮助

答案 2 :(得分:0)

Json方法已经设置了正确的内容类型,因此您无需重复它:

return Json(response);

但是根据您描述的行为(另存为对话框),我怀疑该表单实际上并未使用AJAX发布,而是普通的POST。这可能是因为在应用.ajaxForm函数时DOM尚未就绪。确保您在$(document).ready

中填写表单
$(function() {
    var options = {
        dataType: "json",
        clearForm: true,
        beforeSubmit: hideUpdateField,
        success: handleNewsPostSuccess
    };
    $('div#Updates form').ajaxForm(options);
});

此外,如果在handleNewsPostSuccess回调中您在DOM中重新创建表单,则ajaxForm可能不再适用于该表单,并且第二次尝试提交时将执行正常的POST。