c#mvc从AJAX调用返回JSON或文件

c#mvc从AJAX调用返回JSON或文件,c#,asp.net-mvc-3,jquery,C#,Asp.net Mvc 3,Jquery,我的观点是这样的: var url = '@Url.Action("DownloadZip", "Program")' + '?programNums=' + selectedRow; $.ajax({ url: url, dataType: 'json', async: false, success: function (data) {

我的观点是这样的:

        var url = '@Url.Action("DownloadZip", "Program")' + '?programNums=' + selectedRow;

        $.ajax({
            url: url,
            dataType: 'json',
            async: false,
            success: function (data) {
                if (data != "Successful") {
                    alert(data);
                }
            }
        });
如果出现错误,控制器可以返回文件或JSON结果。 没能让他们俩一起工作

下面是它的外观:

    public ActionResult DownloadZip(string programNums)
    {

        if(string.IsNullOrEmpty(programNums))
        {
          return Json("Error, blank info sent.", JsonRequestBehavior.AllowGet);
        }            

        var memoryStream = new MemoryStream();

        using (var zip = new ZipFile())
        {
            zip.AddFile("C:\\sitemap.txt");
            zip.Save(memoryStream);
        }

        memoryStream.Seek(0, 0);
        return File(memoryStream, "application/octet-stream", "archive.zip");

    }

我看到的是ajax调用需要返回一个JSON值。因为在我的例子中,它返回一个文件,所以它不能工作。无论如何,我要处理我正在做的事情,它可以从ajax调用返回JSON或文件

我认为您将在这个实现中遇到很多问题。实际上,您无法通过AJAX上传或下载文件。请参阅下面的链接

您应该使用上面粘贴的问题中共享的两个实现之一。如果使用IFRAME方法,则可以使用jQuery检查文档何时完成以及是否成功


编辑:您可以抛出一个服务器异常(500)。如何处理IFRAME中的500取决于您。

您考虑过用文件Url传回JSON吗


如果文件已成功找到/创建。将JSON结果与文件链接一起发回。然后在javascript中使用
windows.location
检索文件。当出现错误时,JSON结果将包含错误信息,并且该信息可以显示给用户。要使其工作,您需要创建另一个端点(操作)来流式处理文件。

您的代码永远不会工作,因为您无法将二进制数据流式处理到Ajax请求—您没有正常的响应上下文可供写入

您可以采取以下几种方法:

  • 如果验证通过,只需将一个新链接返回到另一个链接即可 将数据流传输给用户的处理程序。然后你会读 在Javascript回调函数上创建此链接,并以新的方式打开它 窗户
  • 使用IFRAME,正如上面DAN Natic建议的那样
  • 更复杂的是:Base64对二进制数据进行编码,并将其作为Json结果的一部分返回。读取base64编码的文件,使用Javascript对其进行解码(在线上可以找到大量用于解码的库),然后对结果进行处理
    *我不确定在ZIP文件的情况下是否可以做任何事情。使用此技术,您可能可以在浏览器内部内联显示PDF文件,但对于它是否适用于所有浏览器,您深表怀疑。我的建议是使用选项1。

    Ajax:window.location='/Home/download'

    c#:


    在ajax调用中,它指定需要
    json
    作为返回的类型。这与发送文件时返回的“应用程序/八位字节流”不同。尝试从ajax调用中删除行
    dataType:'json'
    ?谢谢Shane-确实删除了dataType:json,但这不起作用。它返回了文件,但格式不可读。我已经读到AJAX不是下载文件的好方法。这里有一个类似的问题
            public FileResult download()
            {
               return File("~/" + path, "application/pdf", string.Format(fileName));
            }