FireFox和IE9尝试下载或显示json响应,而不是让javascript解析它

时间:2011-07-22 12:57:51

标签: c# jquery ajax asp.net-mvc-3 cross-browser

更新

我的问题是我使用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中是以不同的方式完成的吗?

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

要尝试的事情:

  1. 如果此$.ajax次调用是在某个主播的.click.submit处理程序内进行的,或<form>请确保您return false;在最后,以便{取消默认行为并为执行AJAX请求留出时间。您使用的attr('action')让我相信情况就是这样。
  2. 删除traditional: true参数,您正在发送JSON请求=&gt;这是无关紧要的。
  3. 确保您网页上没有其他一些javascript错误,因为它们可能会阻止js执行并进入正常表单提交
  4. 如果您要返回JSON,请从服务器中删除所有text/plain。做这样的事情毫无意义,而且绝对不是你的问题所在。只需使用return Json(alert);
  5. 因此,如果您是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作为内容类型吗?