Asp.net mvc 是否在运行时为操作方法创建适当的参数?

Asp.net mvc 是否在运行时为操作方法创建适当的参数?,asp.net-mvc,Asp.net Mvc,情况是这样的 我有一个action方法,它返回一个名为“Documents”控制器中的“GetDocument”文件。它有一个类型为Document的参数,包含文档路径、标题、类型等 我有一个实体的视图,它附带了一些文档。例如,一篇新闻报道,附带文档。在这个视图中,我显示了最终用户应该能够下载的文档的各种链接 问题是:如何创建这样的链接,将适当的“Document”对象传递给“GetDocument”操作方法 编辑:我不想向用户显示文档的完整路径。事实上,我希望我将文档存储在App_数据文件夹中

情况是这样的

我有一个action方法,它返回一个名为“Documents”控制器中的“GetDocument”文件。它有一个类型为Document的参数,包含文档路径、标题、类型等

我有一个实体的视图,它附带了一些文档。例如,一篇新闻报道,附带文档。在这个视图中,我显示了最终用户应该能够下载的文档的各种链接

问题是:如何创建这样的链接,将适当的“Document”对象传递给“GetDocument”操作方法

编辑:我不想向用户显示文档的完整路径。事实上,我希望我将文档存储在App_数据文件夹中,这样它们就不能以其他方式下载


谢谢

您可以使用
ActionLink

@Html.ActionLink(
    "Download", 
    "GetDocument", 
    new {
        path = "report.pdf",
        type = "application/pdf"
    }
)
然后:

public ActionResult GetDocument(Document doc)
{
    var appData = Server.MapPath("~/App_Data");
    var file = Path.Combine(appData, doc.Path);
    file = Path.GetFullPath(file);
    if (!file.StartsWith(appData))
    {
        // Ensure there are no cheaters trying to read files
        // outside of the App_Data folder like "../web.config"
        throw new HttpException(403, "Forbidden");
    }
    if (!File.Exists(file))
    {
        return HttpNotFound();
    }
    return File(file, doc.Type, Path.GetFileName(file));
}

在调用操作时,为什么控制器需要了解完整文档?你的文件肯定有身份证。获取id,向存储库请求域对象,然后获取文件。

ASP.NET处理相对路径的能力如何?用户可以输入“../../somethingsecret.config”@jgauffin,非常好的评论。我已经更新了我的答案来考虑它。谢谢你的答案!从安全角度来看,一个问题是:用户仍然可以使用您的方法查看路径(相对于App_数据)。好吗?@virtualmic,是的,用户可以看到路径
App\u数据
,但不能直接访问。他需要使用
GetDocument
操作,但如果他知道文件名,他可以访问其中的任何文件。如果您想实现更细粒度的安全性,建议将路径存储到数据库中,将其与用户权限关联,等等。。。