Javascript 下载MVC文件结果不需要';不能在IE或Edge浏览器中工作

Javascript 下载MVC文件结果不需要';不能在IE或Edge浏览器中工作,javascript,c#,asp.net-mvc,Javascript,C#,Asp.net Mvc,我正在尝试下载一个excel文件,该文件是通过MVC应用程序中的网页输入的数据生成的 这个ajax调用在按下按钮时执行,并调用我的控制器中的两个方法。一个用于生成excel文件,另一个用于下载文件: $.ajax({ type: 'POST', data: myDataObject, url: 'MyController/GenerateExcel/', success: function(data)

我正在尝试下载一个excel文件,该文件是通过MVC应用程序中的网页输入的数据生成的

这个ajax调用在按下按钮时执行,并调用我的控制器中的两个方法。一个用于生成excel文件,另一个用于下载文件:

$.ajax({
            type: 'POST',
            data: myDataObject,
            url: 'MyController/GenerateExcel/',
            success: function(data) {
                if (data.id != "") {
                    $http.get('MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
                    return true;
                }
            }
        });
以下是生成excel文件并将其保存到TempData的我的POST方法:

[HttpPost]
    public JsonResult GenerateExcel(Object model)
    {
        var fileName = "myexcel.xlsx";
        var fileID = Guid.NewGuid().ToString();

        var generatedReport = GenerateCustomExcel(model);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            generatedReport.SaveAs(memoryStream);
            generatedReport.Dispose();
            memoryStream.Position = 0;
            TempData[fileID] = memoryStream.ToArray();
        }


        return Json(new { id = fileID, name = fileName });
    }
[HttpGet]
    public FileResult DownloadExcel(string id, string name)
    {
        if (TempData[id] != null)
        {
            byte[] fileBytes = TempData[id] as byte[];
            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name);
        }
        else
        {
            return null;
        }
    }
以下是从TempData下载保存的excel的GET方法:

[HttpPost]
    public JsonResult GenerateExcel(Object model)
    {
        var fileName = "myexcel.xlsx";
        var fileID = Guid.NewGuid().ToString();

        var generatedReport = GenerateCustomExcel(model);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            generatedReport.SaveAs(memoryStream);
            generatedReport.Dispose();
            memoryStream.Position = 0;
            TempData[fileID] = memoryStream.ToArray();
        }


        return Json(new { id = fileID, name = fileName });
    }
[HttpGet]
    public FileResult DownloadExcel(string id, string name)
    {
        if (TempData[id] != null)
        {
            byte[] fileBytes = TempData[id] as byte[];
            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name);
        }
        else
        {
            return null;
        }
    }
这在Google Chrome和Firefox浏览器中都能完美地工作。但是,当使用Internet Explorer或Microsoft Edge浏览器时,该文件拒绝下载

调试控制台不会产生任何有用的错误。我尝试将返回的文件类型更改为八位字节流,并使用window.location.href而不是get请求来下载文件,但似乎没有任何效果。所有的函数都被调用,数据在它们之间正确传递,因此路由不是问题


有人知道如何下载返回的FileResult吗?

这里有一个解决方案。除了这里列出的更改之外,它使用与我的问题相同的代码

将iframe元素添加到网页:

<iframe id="iFrameFileDownload" style="display: none;"></iframe>

我考虑的另一个解决方案是使用window.open()函数而不是$http.get()。(来源:)但是,该解决方案使用弹出窗口,并要求用户在下载文件之前在浏览器中启用弹出窗口。

这可能会有所帮助,尽管公认的答案仅适用于PDF,但您可以根据您的情况进行调整: