更新
我的问题是我使用event.preventDefault()而不是返回false来阻止表单正常发布。 FF和IE不喜欢这样,并打破了那条线的JS。我删除了它并在最后附加了返回false,这解决了问题。感谢Darin Dimitrov提供了广泛的清单。
原始问题
我正在使用ASP.NET MVC3和jquery ajax将json数据发布到服务器并接收响应。但是,当我使用Chrome时,它会正常读取json响应,更新我想要的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中是以不同的方式完成的吗?
有什么想法吗?
答案 0 :(得分:4)
要尝试的事情:
$.ajax
次调用是在某个主播的.click
或.submit
处理程序内进行的,或<form>
请确保您return false;
在最后,以便{取消默认行为并为执行AJAX请求留出时间。您使用的attr('action')
让我相信情况就是这样。traditional: true
参数,您正在发送JSON请求=&gt;这是无关紧要的。text/plain
。做这样的事情毫无意义,而且绝对不是你的问题所在。只需使用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请求,那么您的代码似乎很好,jsu确保没有其他一些JS错误。
答案 1 :(得分:1)
我遇到了同样的问题,其中“JsonRequestBehavior.AllowGet”在chrome上工作得很好,但在IE上失败了。我尝试了很多格式,但下面是唯一一个适用于IE的格式。
return Json(additionalData, "text/html")
答案 2 :(得分:0)
我在使用旧版本的jQuery.Validate时遇到过这种情况,这与设置错误的dataType的错误有关。
确保您使用的是最新版本的jQuery.validate
答案 3 :(得分:0)
返回Json(警告,“text / plain”);
通常Json(alert)
就足够了。您可以尝试将application/json; charset=utf-8
作为内容类型吗?