我有一个列表视图,我想将所有数据导出为txt文件。根据要求,我需要通过单击“导出”按钮创建3个txt文件。我有一个控制器动作来生成这些文件并将其下载为zip文件。当我单击“导出”按钮时,它将触发操作" ExportFiles"。同时我想重定向到行动" List"因为我想刷新视图。
但问题是我不能同时做这两项任务。那我该怎么办?
这是我的代码;
public virtual ActionResult List()
{
// Code : showing my list
return view();
}
public virtual ActionResult ExportFiles()
{
// Code : Generating files
return new ZipResult(filePath, fileName + ".zip");
// HERE I WANT TO REFRESH MY VIEW
}
public class ZipResult : ActionResult
{
private readonly string _filePath;
public string Filename { get; set; }
public ZipResult(string filePath, string fileName)
{
_filePath = filePath;
Filename = fileName;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var response = context.HttpContext.Response;
response.ContentType = "application/gzip";
using (var zip = new ZipFile())
{
zip.AddFile(_filePath);
zip.Save(response.OutputStream);
var cd = new ContentDisposition
{
FileName = Filename,
Inline = false
};
response.Headers.Add("Content-Disposition", cd.ToString());
}
}
}
答案 0 :(得分:0)
相反,不可能在一个响应上同时进行刷新和文件下载。 当您尝试时,您将获得异常,例如“在发送HTTP标头后无法重定向”。
您必须稍微调整一下策略,例如:
<meta http-equiv="refresh" content="5,url=DownloadFile.aspx" />
希望它有所帮助。
答案 1 :(得分:0)
由于您的导出将返回一个文件,因此您只需刷新您从(您的列表)开始的视图。如果是这种情况,那么我所做的就是在选择下载按钮后几秒钟刷新页面(我这样做,以便视图显示更新的下载计数和日期)。
在视图(您的列表)中,我通常会在运行类似于下面的脚本的下载按钮中添加onclick事件。其他一切都保持不变。
function ReloadPage()
{
setTimeout(function () {
window.location.reload(1);
}, 5000);
}