在 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 虚拟路径提供程序

ASP.NET MVC 视图 - 获取 JavaScript 的虚拟路径 [重复]

如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径

Site.less' 是物理路径,但应为虚拟路径

详细解说Tomcat 设置虚拟路径的几种方法及为啥设置虚拟路径

pyenv和virtualenv搭建python虚拟环境