标准ASP.NET模板“Content
”中有一个目录,大多数人似乎都在放入图像和css文件等。
例如stackoverflow的徽标:
(来源:stackoverflow.com)
实际上是指在URL中包含“内容”的服务器路径(只需对任何SO页面执行查看源代码,您就会看到这一点)。所以他们显然是在“content/images/...
”中存储图像。
src="/Content/Img/stackoverflow-logo-250.png"
编辑:在过去10年的某个时候,他们改变了路径 - 但这就是过去的情况。
我不是特别喜欢这个。我的HTML最终只有/content
,并且稍微难以迁移只有/ image的现有页面。幸运的是,只要我将样式表保存在content
中,我的样式表就不会以content\site.css
结尾。
另一种方法是在根目录中放置images
目录,但是images
与Controllers
和Views
处于同一级别,这非常可怕。< / p>
我想知道尝试添加这样的重定向规则:
routes.RedirectRoute(
"images rule",
"Images/{*}",
"Content/Images/{1}"); // this is NOT valid code - I made it up
但是那段代码不起作用,因为我刚刚编写了它。我可以使用第三方重定向/重写插件,但我想在MVC模型中保持一切“纯粹”。
在这方面有什么人发现的?或者每个人都对他们所服务的每个图像的源中额外("/content".length)
个字节感到满意。
答案 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中。