我正在开发一个页面,用户可以在其中下载包含多个.pdf files
的.zip
。处理下载和压缩的功能运行良好,我的问题是,当我按下下载按钮时,它会使我的页面进入一个无休止的循环。就好像它正在加载下一个View
,但由于ActionResult
返回的是File
,而不是View
或重定向,因此它永远无法加载页面。我已经尝试将formtarget
设置为_blank
,这样下载就会在一个新的选项卡中打开,但这仍然会使原始选项卡处于无休止的循环中。
这是我的controller
方法:
[HttpPost]
public ActionResult DownloadCertificatesByModel([Bind(Include = "OrderNumber,ChosenLanguages,ChosenTemplates")] OrderViewModel viewModel)
{
var certificates = GetCertificatesByOrderNumber(viewModel.OrderNumber, viewModel.ChosenLanguages, viewModel.ChosenTemplates);
using (var memoryStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach(var cert in certificates)
{
//If the file actually exists
if (cert.Value)
{
zipArchive.CreateEntry(cert.Key.CertificateName);
}
}
}
return File(memoryStream.ToArray(), "application/zip", viewModel.OrderNumber + "_certificates.zip");
}
}
这是我的Razor View
中有问题的部分:
<input type="submit" value="Download All Certificates" class="btn btn-default" formaction="DownloadCertificatesByModel" style="margin-right:10px" formtarget="_blank" />
如何让controller
操作返回一个文件,但保持当前页面的原样,即不重定向或其他任何操作,只启动下载
更新:我应该提到的是;选择";模型中的变量是List<SelectListItem>
,这意味着当我试图遵循@cacalonga's
的建议(将POST
更改为GET
(时,我会得到一个错误,即查询字符串超过了允许的最大长度。为了解决这个问题,我尝试在Web.config
中增加MaxQueryLength
,但这也不起作用,因为查询非常长,因为它包含所有的SelectListItems
。
您应该使用httpget方法。
[HttpGet]
public ActionResult DownloadCertificatesByModel([Bind(Include = "OrderNumber,ChosenLanguages,ChosenTemplates")] OrderViewModel viewModel)
{
var certificates = GetCertificatesByOrderNumber(viewModel.OrderNumber, viewModel.ChosenLanguages, viewModel.ChosenTemplates);
using (var memoryStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach(var cert in certificates)
{
//If the file actually exists
if (cert.Value)
{
zipArchive.CreateEntry(cert.Key.CertificateName);
}
}
}
return File(memoryStream.ToArray(), "application/zip", viewModel.OrderNumber + "_certificates.zip");
}
}
在cshtml方面:
<form action="/YourActionController/DownloadCertificatesByModel" method="get">
<input type="text" name="OrderNumber" value="" />
<input type="text" name="ChosenLanguages" value="" />
<input type="text" name="ChosenTemplates" value="" />
<input type="submit" value="Download All Certificates" class="btn btn-default" />
/表单>