在ASP.NET MVC应用程序中放置图像和静态文件的位置的正确做法?

Sim*_*ver 5 asp.net-mvc

标准ASP.NET模板中有一个目录" Content",大多数人似乎都在放入图像和css文件等.

例如stackoverflow的徽标:

替代文字
(来源:stackoverflow.com)

实际上是指在URL中包含"内容"的服务器路径(只需对任何SO页面执行查看源,您就会看到这一点).所以他们显然是在" content/images/..." 中存储图像.

src="/Content/Img/stackoverflow-logo-250.png" 
Run Code Online (Sandbox Code Playgroud)

编辑:在过去10年的某个时候,他们改变了路径 - 但这就是过去的情况.

我不是特别喜欢这个.我的HTML最终会/content全面覆盖,而且稍微难以迁移只有/ image的现有页面.幸运的是content,只要我保存它,我的样式表就不会全部结束content\site.css.

另一种方法是images在根目录中放置一个目录,但是你会images达到相同的级别Controllers,Views这是非常可怕的.

我想知道尝试添加这样的重定向规则:

routes.RedirectRoute(
   "images rule",
   "Images/{*}",
   "Content/Images/{1}");    // this is NOT valid code - I made it up
Run Code Online (Sandbox Code Playgroud)

但是这个代码不起作用,因为我刚刚编写了它.我可以使用第三方重定向/重写插件,但我想在MVC模型中保持一切"纯粹".

这个地区还有谁发现了什么?或者每个人都("/content".length)对他们所服务的每个图像的源中额外的字节感到满意.

And*_*rse 3

老实说,我不认为这真的值得担心......“/Content”对页面大小的贡献非常小。如果您仍然想这样做,这里有一些选择:

如果您在自己的服务器上运行,选项 1 是查看 IIS URL 重写模块: http: //learn.iis.net/page.aspx/460/using-url-rewrite-module/

选项2是使用RedirectResult或ContentResult,在MVC框架中达到相同的效果

首先,将“Images/”下的“catchall”路由映射到控制器操作,如下所示

routes.MapRoute("ImageContent", 
                "Images/{*relativePath}", 
                 new { controller = "Content", action = "Image" })
Run Code Online (Sandbox Code Playgroud)

确保它位于标准“{controller}/{action}/{id}”路线之上。然后,在 ContentController 中(或者您决定放置它的任何地方):

public ActionResult Image() {
    string imagePath = RouteData.Values["relativePath"]
    // imagePath now contains the relative path to the image!
    // i.e. http://mysite.com/Images/Foo/Bar/Baz.png => imagePath = "Foo/Bar/Baz.png"
    // Either Redirect, or load the file from Content/Images/{imagePath} and transmit it
}
Run Code Online (Sandbox Code Playgroud)

我做了一个快速测试,它似乎有效。如果您有任何问题,请在评论中告诉我!