在 MVC 3 Asp.Net“视图”文件夹中路由图像



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

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

这是我使用的路线:

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 ~/Views/Manuals/da-DK/ATEXSymbol.svg.ascx ~/views/Shared/da-DK/ATEXSymbol.svg.aspx ~/Views/Shared/da-DK/ATEXSymbol.svg.ascx ~/Views/Manuals/da-DK/ATEXSymbol.svg.cshtml ~/Views/Manuals/da-DK/ATEXSymbol.svg.vbhtml ~/Views/Shared/da-DK/ATEXSymbol.svg.cshtml ~/Views/Shared/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>

。它有效...但是如果我使用它(同样的事情,但与视图文件夹中的图像相同(......

<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>

使用此路由:

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

在控制器手册中创建此操作控制器

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");
}

无需自定义视图引擎。 文件结果就是为这个场合而设计的。

也许你的问题的答案在你的错误中:

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

您是否考虑过插入自定义视图引擎?

我自己从未创建一个,也无法提供指导,所以这是一个不完整的答案(我可以稍后根据评论删除(。不过,这是一个有趣的问题,据我所知,这是一个独特的问题。我想知道谁会规定将项目"集体倾倒"为一个按照惯例不以这种方式工作的框架。不过,如果您使用的是Web表单,则非常简单。

相关内容

  • 没有找到相关文章

最新更新