更新
我的问题是我使用 event.preventDefault() 而不是 return false 来阻止表单正常发布。 FF 和 IE 不喜欢那样并通过那条线破坏了 JS。我删除了它并在最后附加了 return false ,这解决了问题。感谢 Darin Dimitrov 提供的详尽 list 。
原始问题
我正在使用 ASP.NET MVC3 和 jquery ajax 将 json 数据发布到服务器并接收响应。但是,当我使用 Chrome 时,它会正常读取 json-response,更新我想要的 div 等。但是对于 IE 和 FF,它不起作用。他们只阅读响应并仅在页面上显示。
我看到其他一些线程提到将 mime 类型定义为“text/plain”。这改变了之前提示用户下载 json-response 的行为。
这是制作帖子的 javascript:
$.ajax({
url: $("#formRegister").attr("action"),
type: 'POST',
data: JSON.stringify(user),
dataType: 'json',
contentType: 'application/json, charset=utf-8',
traditional: true,
success: function (data) {
alertMessage(data.Message);
},
error: function () {
}
});
这是接收调用并返回 JsonResponse 的 ActionMethod:
[HttpPost]
public JsonResult Register(UserRegisterPackage package)
{
ClientAlert alert = new ClientAlert();
if (package.Password != null)
{
//bool success = Removed for simplicity's sake.
bool success = true;
if (success)
{
alert.Message = "Success!";
}
else
{
alert.Message = "Failed to register";
}
}
else
{
alert.Message = "You need to enter a password!";
}
return Json(alert, "text/plain");
}
正如我所说,当内容类型定义为 text/plain 时,浏览器仅显示响应,而当未定义时,它会提示用户下载 json-response。
使用 FF 我似乎得到了一个错误:
"event is not defined
event.preventDefault(); "
这可能与错误有关。但我需要阻止表单正常发布。这在 FF 或 IE 中有不同的做法吗?
有什么想法吗?
最佳答案
要尝试的事情:
- 如果这
$.ajax
在.click
内部进行调用或.submit
一些 anchor 的处理程序或<form>
确保你return false;
最后取消默认行为并留出时间让您的 AJAX 请求执行。attr('action')
你正在使用的东西让我相信情况就是这样。 - 删除
traditional: true
参数,你正在发送一个 JSON 请求 => 它是无关紧要的。 - 确保您的页面上没有其他一些 javascript 错误,因为它们可能会停止 js 执行并继续正常提交表单
- 删除所有
text/plain
如果您打算返回 JSON,请从您的服务器获取。做这样的事情是没有意义的,这绝对不是你的问题所在。只需使用return Json(alert);
.
因此,如果您使用 AJAX 化表单,您甚至不需要任何 JSON 请求,只需:
$('#formRegister').submit(function() {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (data) {
alertMessage(data.Message);
},
error: function () {
}
});
return false;
});
如果您打算发送 JSON 请求,那么您的代码似乎没问题,请确保没有其他 JS 错误。
关于c# - FireFox 和 IE9 尝试下载或显示 json-response 而不是让 javascript 解析它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790346/