.net MVC如何下载文件并保持在同一页面上



我正在开发一个页面,用户可以在其中下载包含多个.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" />

/表单>

相关内容

最新更新