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

时间:2009-01-23 23:09:04

标签: asp.net-mvc

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

例如stackoverflow的徽标:

alt text
(来源:stackoverflow.com

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

src="/Content/Img/stackoverflow-logo-250.png" 

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

我不是特别喜欢这个。我的HTML最终只有/content,并且稍微难以迁移只有/ image的现有页面。幸运的是,只要我将样式表保存在content中,我的样式表就不会以content\site.css结尾。

另一种方法是在根目录中放置images目录,但是imagesControllersViews处于同一级别,这非常可怕。< / p>

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

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

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

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

2 个答案:

答案 0 :(得分: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" })

确保它高于您的标准“{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
}

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

答案 1 :(得分:2)

将图像放在不同的子域下通常会更好。原因是浏览器限制了每个URL的连接数。因此,如果您现在使用http://static.mysiste.com,则浏览器可以打开更多并发连接,因为它位于不同的URL中。