在Asp.Net MVC中相对于视图路由图像?

时间:2012-03-12 21:36:25

标签: asp.net-mvc-3 asp.net-mvc-routing relative-path

我需要能够将图像放在相对于视图的路径中,但我不知道如何实现这一点,因为我对MVC路由没有很好的把握:

如果我有这样的路线:

routes.MapRoute(
                "Parameter",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Product", lang = "en-US", prod = "productname" }

然后我尝试使用图像的相对路径:

<embed class="images src="@Url.Content("images/sampleimage.svg")"></embed>

这给了我一条路径(如果我在网络检查器中检查它),如下所示: SRC = “HTTP://localhost/Manuals/Product/en-US/images/sampleimage.svg”

不是图像的位置。它位于“http://localhost/Views/Manuals/en-US/productname/images/sampleimage.svg”

所以基本上,Views文件夹,然后没有像动作名称(Product)这样的文件夹。那么如何在这种环境中使用相对于视图的路径呢?该动作成为url的一部分,但是没有名为action方法的实际文件夹,并且图像也将位于Views文件夹下,而该文件夹不是url的一部分...此外,url的最后一部分路径(productname)似乎在图像路径中根本没有显示,它似乎被解释为id或者某种东西,因为我只使用一种动作方法来根据参数lang和prod来提供视图?

是否无法放置这样的图像,并使用像“images / imagename.svg”之类的相对路径?或者我只是误解了MVC中的路由?

我需要这样做以简化添加大量内容和XSL转换的结果......

编辑:对不起,我得到的一些网址不正确。现在应该修复以反映我所拥有的。

2 个答案:

答案 0 :(得分:2)

我不确定你是否理解框架应该如何工作。

我的第一点是关于惯例。惯例是您将视图存储在Views文件夹中。然后,您可以为显示/编辑模板或共享部分视图使用DisplayTemplates,EditTemplates和Shared。这是MVC开发人员习惯的惯例,因此如果您开始在这些文件夹中放置其他内容,您将会混淆其他开发人员,并最终自己。

你想要达到什么目的?您是否使用某种特定格式的网址?您拥有的一个选项是实现将返回您的图像的操作。另一种选择是URL重写或路由到静态文件:Using ASP.NET routing to serve static files

答案 1 :(得分:2)

使用控制器操作从数据库或磁盘获取图像。 以下是从站点根目录中名为“ImageFolder”的文件夹中获取图像的示例。

public virtual FilePathResult GetImage(string imageId){
    var path = Path.Combine(Server.MapPath("~"), "ImageFolder", imageId + ".svg");
    return new FilePathResult(path, "image/jpg");
}

您可以使用类似的东西来检索产品的样本图像。

在ASP.NET MVC中,您不依赖文件夹层次结构来导航您的站点。该框架有一些文件夹约定,但它们不用于路由。

对于静态图像,您可以将它们放在Content / images文件夹中。