在运行时期间为Action Method创建适当的参数?

时间:2011-05-20 05:26:55

标签: asp.net-mvc

情况就是这样。

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

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

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

修改:我不想向用户显示文档的完整路径。事实上,我希望我将文档存储在App_Data文件夹中,这样就无法下载它们。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用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));
}

答案 1 :(得分:0)

为什么您的控制器在调用操作时需要知道完整的文档?当然你的文件有ID。获取id,向存储库询问域对象,然后获取文件。