因此,关于整个“IE为通过Ajax返回的Json数据打开下载文件对话框”(例如this one或this 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”响应时,它不会这样做。
有没有办法解决?
(我需要进一步解释吗?)