在Asp.Net MVC 3中的View文件夹中路由图像

时间:2012-05-04 14:33:31

标签: asp.net asp.net-mvc-3 asp.net-mvc-routing viewengine

我之前尝试过这个问题有点不同,但是没有理解,所以我会尝试另一种方式:

我有一个MVC 3应用程序,我像往常一样在Views目录中有视图。但是,出于各种原因,我需要每个视图的图像与视图本身位于同一文件夹中,即在我的情况下,例如查看/手册/ EN-US /名称

这是我使用的路线:

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

现在,如上所述,我需要将此视图的图像放在同一个文件夹中,以便图像路径可以简单地为“ATEXSymbol.svg”。

当我只有这条路线,并为图像使用这样的简单相对路径时,我得到的是这样的错误:

  

未找到视图'da-DK / ATEXSymbol.svg'或其主人或   没有视图引擎支持搜索的位置。下列   搜索位置:〜/ Views / Manuals / da-DK / ATEXSymbol.svg.aspx   〜/查看/手册/ DA-DK / ATEXSymbol.svg.ascx   〜/查看/共享/ DA-DK / ATEXSymbol.svg.aspx   〜/查看/共享/ DA-DK / ATEXSymbol.svg.ascx   〜/查看/手册/ DA-DK / ATEXSymbol.svg.cshtml   〜/查看/手册/ DA-DK / ATEXSymbol.svg.vbhtml   〜/查看/共享/ DA-DK / ATEXSymbol.svg.cshtml   〜/查看/共享/ DA-DK / ATEXSymbol.svg.vbhtml

所以基本上,它正在寻找正确语言文件夹中的图像,但是没有产品名称文件夹部分,并且附加了许多视图扩展名之一。我知道MVC并不真正期望在同一个文件夹中有这个相对路径,但我几乎没有任何选择。我需要将图像放在同一个文件夹中以达到我手中的目的。

那我怎么能实现这个目标呢?

编辑:

实际上,我有点误以上,说路径的产品名称部分缺失,当然不是。路径的那一部分是视图本身的名称。所以基本上我通过src属性中的简单相对路径(只是图像文件的名称)获得的路径为图像创建了正确的路径。唯一的问题是添加了视图文件扩展名......

任何人都知道如何解决这个问题?

编辑2:

顺便说一下,我本来可以使用Url.Content,但由于某些原因,它也不起作用。如果我用这个:

<embed  type="image/svg+xml" src="@Url.Content("~/Content/images/da-DK/3153/CheckRotation.svg")"></embed>

......它有效...但如果我使用它(同样的东西,但与Views文件夹中的图像)...

<embed  type="image/svg+xml" src="@Url.Content("~/Views/Manuals/da-DK/CheckRotation.svg")"></embed>

......它不起作用。如果我在Web检查器中检查后一个示例中的路径,它看起来像正确的路径(localhost:49864 / Views / Manuals / da-DK / CheckRotation.svg),但显示无法找到它的消息。

编辑3:

Thinking Sites的答案给了我一个解决方案,我只需稍微修改一下,因为我需要为视图本身建议的路径。所以我添加了这条路线:

routes.MapRoute(
                "Image",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Image", lang = "en-US", prod = "name" }
        );

我在路径上稍作调整(如建议的那样),因为prod现在实际上带有整个文件名,包括扩展名:

public ActionResult Image(string lang, string prod)
        {
            var root = Server.MapPath("~/Views/Manuals/");
            var filepath = Path.Combine(root, lang, prod); // whatever creates your path here.
            return File(filepath, "image/svg+xml");
        }

然后在视图中我可以有这样的路径:

<embed  type="image/svg+xml" src="@Url.Content("/Manuals/Image/da-DK/CheckRotation.svg")"></embed>

2 个答案:

答案 0 :(得分:1)

使用此路线:

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

在控制器ManualsController中创建此操作

public ActionResult Product(string lang,string prod){
   var root = Server.MapPath("~/views/manuals/");
   var filepath = Path.Combine(root,lang,prod,".svg"); // whatever creates your path here.
   return File(filepath ,"your mime type");
}

无需自定义视图引擎。 FileResult就是为这种场合而设计的。

答案 1 :(得分:0)

也许您的问题的答案出现在您的错误中:

找不到视图'da-DK / ATEXSymbol.svg'或其主人或没有视图引擎支持搜索到的位置

您是否考虑过插入custom view engine

我从来没有自己创造过一个&amp;不能提供指导,所以这是一个不完整的答案(我可以稍后根据评论删除)。这是一个有趣的问题,而且我可以说一个独特的问题。我想知道谁会指责那些项目被“大量抛弃”,因为这个框架不符合惯例。如果您正在使用Web表单,那么非常简单。