我正在使用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,但没有区别。
答案 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。