2011-05-20 16 views
0

这是情况。在运行期间为Action方法创建适当的参数?

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

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

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

编辑:我不想显示文档的完整路径给用户。实际上,我希望将文档存储在App_Data文件夹中,以便它们不能以其他方式下载。

谢谢!

回答

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

ASP.NET如何处理相对路径?用户可以输入“../../somethingsecret.config”吗? – jgauffin 2011-05-20 06:40:17

+0

@jgauffin,优秀的评论。我已经更新了我的答案并将其考虑在内。 – 2011-05-20 06:42:15

+0

现在你得到了我的+1 – jgauffin 2011-05-20 06:59:26

0

为什么你的控制器需要了解的全部文档时动作叫什么?你的文件当然有ID。采取id,询问您的存储库的域对象,然后获取该文件。

相关问题