在 MVC 中创建包的虚拟路径?
Posted
技术标签:
【中文标题】在 MVC 中创建包的虚拟路径?【英文标题】:Virtual paths in creating bundles in MVC? 【发布时间】:2015-01-18 06:41:27 【问题描述】:我正在为我的 mvc 应用程序中的脚本和样式创建包。
bundles.Add(新 ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-1.*"));
bundles.Add(新 StyleBundle("~/Content/css").Include("~/Content/CSS/abc.css"));
在这种情况下,由于存在一个真实的目录~/Content/CSS
,因此存在名称冲突问题,因此它找不到css并且无法应用样式。所以我将虚拟路径更改为~/Content/styles/css
,它可以工作。
所以我在这里有点困惑,虚拟路径在这里如何工作?
【问题讨论】:
我想在这种情况下 IIS 决定您正在访问现有目录并且没有将请求传递给 mvc 管道,因此捆绑没有机会工作。可以做个实验:为路由添加handler,检查bundling是否有效。 好的@voroninp 但是MVC如何使用虚拟路径来创建包?例如。如果我使用虚拟路径 ~/bundles/jquery 那么这是否意味着它会在这个位置创建捆绑包? 这不是简单的路由,在后台为 CSS 或 JS 请求提供特殊控制器吗?不确定,但我就是这样做的。 你也可以测试一下。创建工作包和相同的工作路线。看看什么获胜 - 绑定被破坏或控制器的操作没有被调用。 【参考方案1】:使用虚拟路径“~/Content/CSS/someName”会更好,因为“someName”css 将具有与真实 abc.css 相同的路径。 换句话说,bundle 的虚拟路径不仅是路径,还是路径和文件名(在我的示例中,文件名是“someName”)
然后在浏览器中将 web.config 编译调试设置为 false,您将看到捆绑包的虚拟路径。对于浏览器,它是指向 css 或 js 文件的 URL。
为什么对真正的 css 和捆绑使用相同的路径更好?因为 css 中资源的相对路径(img、字体等)。
示例:您有样式 background-image: url(images/1.jpg);在 Content/CSS/abc.css 中并为您的包使用虚拟路径 ~/Content/styles/css。结果你得到 404 的图像,因为浏览器将通过 url 请求图像:/Content/styles/images/1.jpg 而不是 /Content/css/images/1.jpg
如果您在同一个包中包含具有不同路径的 css,请使用 CssRewriteUrlTransformation。
是的,您在示例中遇到了名称冲突,因为结果中的虚拟 css 与真实文件夹具有相同的 url。
【讨论】:
以上是关于在 MVC 中创建包的虚拟路径?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 视图 - 获取 JavaScript 的虚拟路径 [重复]
如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径