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请求—您没有正常的响应上下文可供写入
您可以采取以下几种方法:
*我不确定在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));
}