使用 .ajaxForm 和 C# MVC,如何防止 Internet Explorer 尝试保存 Json 结果

本文关键字:Explorer 保存 结果 Json Internet 何防止 ajaxForm MVC 使用 | 更新日期: 2023-09-27 18:37:27

我通过C# MVC控制器返回了一些Json。其他浏览器工作正常,但 Internet Explorer (IE9) 尝试将返回的 Json 数据另存为文本文件。有什么想法可以防止这种情况发生吗?

//MVC Controller Code...
return Json(new { redirectToUrl = Url.Action("Create", "Album",
                  new { url = url, isLocalFile = isLocalFile})});
//Clientside Javascript Code
$("#uploadImageForm").ajaxForm({
  beforeSubmit: function () {
  },
  success: function (data, textStatus, xhr) {
          window.location.href = data.redirectToUrl;
  },
  error: function (data, textStatus, xhr) {
  } 
});

我尝试将"text/plain"和"text/json"添加到返回 Json 方法的第二个参数中,但它不起作用。

非常感谢!

使用 .ajaxForm 和 C# MVC,如何防止 Internet Explorer 尝试保存 Json 结果

引用

jquery.form插件的文档:

支持 XMLHttpRequest Level 2 的浏览器将能够 无缝上传文件,甚至可以在上传时获取进度更新 收益。对于较旧的浏览器,使用回退技术 涉及 iframe,因为无法使用 XMLHttpRequest 对象的第 1 级实现。这是一个常见的 后备技术,但它有固有的局限性。iframe 元素用作表单提交操作的目标,该 表示服务器响应写入 iframe。这很好 如果响应类型为 HTML 或 XML,但如果 响应类型为脚本或 JSON,两者通常都包含 在以下情况下需要使用实体引用进行修饰的字符 在 HTML 标记中找到。

考虑使用时脚本和 JSON 响应的挑战 iframe模式,表单插件允许嵌入这些响应 在文本区域元素中,建议您为这些元素执行此操作 与文件上传及更早版本结合使用时的响应类型 浏览器。但是,请注意,如果没有文件输入 表单,然后请求使用正常的 XHR 提交表单(不是 iframe)。这给服务器代码带来了负担,不知道何时使用 一个文本区域,什么时候不。

这意味着,如果您的表单包含文件输入字段,并且您要将此表单提交到返回 JSON 的控制器操作,则必须将此 JSON 包装在 <textarea> 标记中。

所以你的回答不应该是这样的:

{ "redirectToUrl":"some url" }

它应该看起来像这样:

<textarea>{ "redirectToUrl":"some url" }</textarea>

为了实现这一点,您可以使用自定义操作结果来包装这些标记的响应:

public class TextareaJsonResult : JsonResult
{
    public TextareaJsonResult(object data)
    {
        this.Data = data;
    }
    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        bool shouldWrap = !context.HttpContext.Request.IsAjaxRequest();
        if (shouldWrap)
        {
            response.Write("<textarea>");
        }
        base.ExecuteResult(context);
        if (shouldWrap)
        {
            response.ContentType = "text/html";
            response.Write("</textarea>");
        }
    }
}

然后让控制器操作返回以下自定义结果:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    // ... some processing
    var redirectToUrl = Url.Action(
        "Create", 
        "Album",
        new { url = url, isLocalFile = isLocalFile }
    );
    return new TextareaJsonResult(new { redirectToUrl = redirectToUrl });
}

现在,显然在 AJAX 成功回调中,您还需要通过测试typeof result来考虑这种差异,并且在旧版浏览器(如 Internet Explorer)的情况下手动解析响应。你可以看看我链接到的页面的源代码。

但话虽如此,我可以看到在您的成功回调中,您正在重定向到服务器返回的 JSON 响应中包含的控制器操作。我的问题是:如果您要重定向,首先使用 AJAX 有什么意义?为什么不使用标准表单发布到控制器操作并让控制器操作直接执行重定向?当您想要保持在同一页面上时,应该使用 AJAX。

我同意杰西的评论,这可能是他提供的链接的副本。

因此,我将提供另一种选择。 我更喜欢使用类似于小提琴手 http://www.fiddler2.com/fiddler2/的 http 代理查看通过线路的 json。 我提到小提琴手是因为它适用于所有浏览器。 优点是可以获得已解析的 json 的树视图。 阅读和找到您要查找的内容要容易得多。

另外,我相信Firefox的Firebug,chrome开发工具和ie开发工具都提供了相同的功能。 (我知道chrome有树视图,我想我记得Firebug有它,如果现代IE没有它,考虑到其他2个,我会感到惊讶。