0

因此,关于整个“IE为通过Ajax返回的Json数据打开下载文件对话框”(例如this onethis one)存在很多问题,但是对于使用Unobtrusive Ajax的人,我没有找到任何答案。

我们像这样做一个简单的 Ajax.BeginForm:

Ajax.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, 
    new AjaxOptions { UpdateTargetId = "ContentContainer", OnSuccess = "JsonCheckRedirect" }, 
    new { id = "form1" }
)

这将发布内容类型为“application/x-www-form-urlencoded; charset=UTF-8”的表单。控制器处理表单,如果出现错误,它会返回一个内容类型为“text/html”的 PartialView,并且该 HTML 被放入 ContentContainer(因为 AjaxOptions 中的“UpdateTargetId”属性)。

如果没有错误,并且用户成功登录,它会返回 Json 以及他们应该重定向到的 URL。所以在Controller中,就这么简单:

return Json(new { Url = returnUrl });

除了我们刚刚有一个用户通知我们在 IE8 中,这会导致下载对话框弹出。在阅读了具有相同问题的所有其他问题之后,我明白为什么会发生这种情况,但是针对这些情况的解决方法是改用这个 Json 返回:

return Json(new { Url = returnUrl }, "text/html");

问题是当我这样返回时,我猜 Unobtrusive Ajax 看到来自服务器的响应是 HTML,它会替换 UpdateTargetId 容器中的内容。当服务器以“application/json”响应时,它不会这样做。

有没有办法解决?

(我需要进一步解释吗?)

4

1 回答 1

0

如果您像这样返回 url,您将需要覆盖 Success 处理程序并检查结果以查看它是否具有 Url 属性,然后将结果放入 window.location。

就个人而言,我不会返回一个新的 Json 结果,而是发回一个 302,这应该会让 ajax 处理程序重定向你。

如果有记忆的话,这发生在 jQuery 的内部,所以你不需要改变任何东西。

因此,与其在成功登录时返回该 json 结果,不如尝试使用 redirectToRoute 结果并将它们发送到您希望它们访问的页面。

于 2013-09-10T10:29:18.667 回答