这是我的控制器的代码:
[HttpPost]
public async Task<ActionResult> DownloadItemList(int subcampaignId, string SheetName, string filename)
{
DataSet ds = new DataSet();
string url = string.Format("api/report/subcampaign/{0}", subcampaignId);
var response = await req.GetXMLAsync(url);
XmlDocument xmlDoc = new XmlDocument();
try
{
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
xmlDoc.PreserveWhitespace = true;
xmlDoc.LoadXml(content);
XmlNodeReader xmlReader = new XmlNodeReader(xmlDoc);
ds.ReadXml(xmlReader);
}
IDataTableToWorkbookUtility workbookExportUtility = new DataTableToWorkbookUtility();
byte[] excelContent = workbookExportUtility
.ExportDataTableToWorkbook(ds.Tables[0], SheetName)
.GetBytes();
return this.File(excelContent, "application/vnd.ms-excel", filename + ".xls");
}
catch (Exception e)
{
log.Debug("CampaignListController/GetAudio: " + e.Message);
throw;
}
}
当我使用ajax.beginform ..而不是下载文件时,响应被读作文本。我想使用ajax,因为我想在使用时单击提交按钮显示加载栏..我想要做的就是在等待文件下载时显示加载状态
答案 0 :(得分:0)
实际上,您无法通过AJAX上传或下载文件。
你可以尝试下面的场景
如果成功找到/创建了文件。使用指向该文件的链接发回JSON结果。然后在javascript中使用windows.location来检索文件。当出现错误时,JSON结果将包含错误信息,并且可以向用户显示此信息。为此,您需要创建另一个可以流式传输文件的端点(操作)。
$.ajax({
..
success: function(data)
{
if( data.result=='success' ){
window.open(download_path + data.fileName);
}
}
..
})
答案 1 :(得分:0)
实际上你可以,你需要使用blueimp的文件上传jquery plugin。它有很多选项并支持跨域。
它还有一个可以实现的加载栏。