【问题标题】:FireFox and IE9 tries to download or show json-response instead of letting javascript parse itFireFox 和 IE9 尝试下载或显示 json-response 而不是让 javascript 解析它
【发布时间】:2013-01-11 21:45:17
【问题描述】:

更新

我的问题是我使用 event.preventDefault() 而不是 return false 来阻止表单正常发布。 FF 和 IE 不喜欢这样,并通过那条线打破了 JS。我删除了它并在最后附加了 return false ,这解决了问题。感谢 Darin Dimitrov 提供的详尽清单。

原始问题

我正在使用 ASP.NET MVC3 和 jquery ajax 将 json-data 发布到服务器并接收响应。但是,当我使用 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 中的处理方式不同吗?

有什么想法吗?

【问题讨论】:

  • 您是否尝试过定义不同的内容类型,例如“text/json”?
  • 给出与不定义内容类型相同的结果;浏览器尝试下载响应。

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


【解决方案1】:

要尝试的事情:

  1. 如果此$.ajax 调用是在某个锚点或<form>.click.submit 处理程序内进行的,请确保您在最后return false; 以取消默认行为并为您的AJAX 留出时间请求执行。您使用的 attr('action') 让我相信是这种情况。
  2. 去掉traditional: true参数,你是在发送一个JSON请求=>它不相关。
  3. 确保您的页面上没有其他 javascript 错误,因为它们可能会停止 js 执行并继续进行正常的表单提交
  4. 如果您打算返回 JSON,请从您的服务器中删除所有 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 请求,那么您的代码看起来不错,请确保没有其他 JS 错误。

【讨论】:

  • 显然因为一个错误需要“traditional: true”。谢谢你,即使它不能解决我的问题,我也会为这个答案添加书签。我现在就试试。
  • event.preventDefault() 在 FF 或 IE 中不起作用。 return false 适用于所有浏览器。因此,除了浏览器接受该行的 Chrome 中,JS 打破了该行。
【解决方案2】:

我遇到了同样的问题,“JsonRequestBehavior.AllowGet”在 chrome 上运行良好,但在 IE 上失败。我尝试了许多格式,但以下是唯一适用于 IE 的格式。

return Json(additionalData, "text/html")

【讨论】:

    【解决方案3】:

    我在使用旧版本的 jQuery.Validate 时遇到了这个问题,这与那里设置不正确的 dataType 的错误有关。

    确保您使用的是最新版本的 jQuery.validate

    【讨论】:

    • 如何检查?我使用最新版本的 jQuery。我需要属性“traditional:true”,因为 ASP.NET 否则无法识别响应。不知道这是否重要。
    【解决方案4】:

    return Json(alert, "text/plain");

    通常Json(alert) 就足够了。您可以尝试将application/json; charset=utf-8 作为内容类型吗?

    【讨论】:

    • 我尝试过你之前的建议,但 FF 和 IE 提示下载响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多