使用asp.net剃须刀页面,我正在尝试将文件下载到浏览器中。从页面(html(中,使用这样的链接可以正常工作:
href="/DownloadableFiles/testB.csv" download="newname">Download Link
但是,我想从Code-Behind或ViewModel
启动下载,以使文件名是什么,我还需要先检查文件,等等。
在ASP.NET MVC Core(不是RazorPages(中,您可以在代码中下载文件:
return File(memory, GetContentType(path), Path.GetFileName(path));
,但剃须刀页面不支持return File
。
pitaridis是正确的,return File
存在于剃须刀页面中,我一定缺少一个名称空间。这将从:
在页面中,这是提交按钮:
<button type="submit" asp-page-handler="DownloadFile" style="width:75px"
class="cancel"> Download </button>
在PageModel(背后的代码(中:
public ActionResult OnPostDownloadFile()
{
return File("/DownloadableFiles/TestFile34.csv", "application/octet-stream",
"NewName34.csv");
}
注意:/DownloadableFiles在wwwroot
也可以使用get呼叫而不是这样的帖子:
将其放在您的页面代码中:
public ActionResult OnGetDownload()
{
return File("c:/Directory/FileName.csv", "application/octet-stream", "FileName.csv");
}
并将其放在该页面上:
<a href="@Url.Page("ThePageName", "Download")>Download</a>
如果要传递参数,只需在url.page调用中包含它们,然后将参数添加到ongetDownload中:
public ActionResult OnGetDownload(int Id)
{
return File("c:/Directory/FileName.csv", "application/octet-stream", "FileName.csv");
}
<a href="@Url.Page("ThePageName", "Download", new { Model.Id })">Download</a>
在我的情况下,我需要在剃须刀页面的Onpost处理程序中下载一个生产的文件。诀窍是产生通往wwwroot的路径相对路径。这对我有用:
public async Task<FileResult> OnPost()
{
var pathToZipOnDisk = ProduceFile();
...
return File($"~/export/{Path.GetFileName(pathToZipOnDisk)}",
"application/zip",
"download.zip");
}