未经测试,我面前没有 VS 可以检查。
总而言之,您需要在您的 DownloadPdf 操作中添加一个参数,并将其与操作链接一起传递。
这是列出所有 PDF 的一些代码(Q 使用 C:\,所以这也是如此,请参阅注释),将它们显示给用户并下载。
控制器:
public ActionResult Index()
{
var files = System.IO.Directory.GetFiles(@"C:\", "*.pdf")
.Select(x => System.IO.Path.GetFileNameWithoutExtension(x))
.ToList();
return View(files);
}
public FileStreamResult ObtenerPdf(string file)
{
FileStream fs = new FileStream("c:\\" + file + ".pdf", FileMode.Open, FileAccess.Read);
return File(fs, "application/pdf");
}
查看:
@model IList<string>
@foreach (var file in Model)
{
<p>@Html.ActionLink(file, "ObtenerPdf", "Home", new { file }, null)</p>
}
几个笔记:
Directory.GetFiles 包含路径 - 还有其他方法可以获取不包含路径的文件列表。
ActionLink 重载是:文本、动作、控制器、路由值、属性 - 如果没有 null,它将选择错误的重载。
在new { file } 中,如果你不指定名称,它将使用变量名,你可以具体匹配动作上的参数名称,这样会更健壮,即:new { file = file },但一些优化器会突出显示这一点。
您可能不想在服务器上的 C:\ 上列出所有 PDF...您可以使用 Server.MapPath 在您的应用程序中找到一个文件夹(然后它不会无论您的网站是否移动)
return File 很可能会超载指定路径,因此您无需先打开它并为您正确处理它等,我使用了与问题中提供的代码相同的代码。