我正在使用DotNetZip MVC扩展方法示例添加多个文件(我从存储库中获取)但我似乎无法弄清楚如何将自己的fileName传递给扩展方法并获得其他结果比“file.zip”,这是他们的例子硬编码默认值。下面是我的CSHTML代码,我的动作和我的扩展方法。您将在我的Action中看到我有一个我想要使用的文件名。
我很尴尬地展示我的尝试,但你可以看到我想用于我的文件名。有什么建议吗?
CSHTML(Razor)
<a href="/Renders/Download/@renders.RenderId">Download</a>
控制器操作:
public ActionResult Download(int id)
{
var allImages = _repo.GetImagesByRender(id);
var list = new List<String>();
var render = _repo.GetRenderById(id);
var fileName = render.Select(r => r.Title);
foreach (var img in allImages)
{
list.Add(Server.MapPath("~/ImageStore/" + img.Path));
}
return new ZipResult(list);
}
扩展方法
public class ZipResult : ActionResult
{
private IEnumerable<string> _files;
private string _fileName;
public string FileName
{
get
{
return _fileName ?? "file.zip";
}
set { _fileName = value; }
}
public ZipResult(params string[] files)
{
this._files = files;
}
public ZipResult(IEnumerable<string> files)
{
this._files = files;
}
public override void ExecuteResult(ControllerContext context)
{ // using clause guarantees that the Dispose() method is called implicitly!
using (ZipFile zf = new ZipFile())
{
zf.AddFiles(_files, false, "");
context.HttpContext.Response
.ContentType = "application/zip";
context.HttpContext.Response
.AppendHeader("content-disposition", "attachment; filename=" + FileName);
zf.Save(context.HttpContext.Response.OutputStream);
}
}
}
对于Repo,它返回由RenderId和propper Render关联的正确Images集合,以便我可以使用Render Title作为fileName,但是如何修改ACtion和Extended Action Method以便制作我的zipFile有正确的名字吗?
答案 0 :(得分:2)
您可以在ZipResult类中添加另一个构造函数:
...
public ZipResult(IEnumerable<string> files, string fileName)
{
this._files = files;
this._fileName = fileName;
}
...
然后在控制器中你可以使用它:
...
return new ZipResult(list, "test.zip");