MVC4 StyleBundle无法解析图像

我的问题与此类似:

ASP.NET MVC 4缩小和背景图片

除非我愿意,否则我会坚持使用MVC的捆绑软件。我脑部崩溃,试图弄清楚指定样式束(例如独立的CSS和jQuery UI等图像集)的正确模式是什么。

我有一个典型的MVC站点结构,/Content/css/其中包含我的基本CSS,例如styles.css在该css文件夹中,我还有子文件夹,例如/jquery-ui包含其CSS文件和一个/images文件夹的子文件夹。jQuery UI CSS中的图像路径是相对于该文件夹的,我不想弄乱它们。

据我了解,当我指定a时,StyleBundle我需要指定一个虚拟路径,该路径也与真实内容路径不匹配,因为(假设我忽略了通往Content的路由)IIS将尝试将该路径解析为物理文件。所以我指定:

bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
       .Include("~/Content/css/jquery-ui/*.css"));

使用以下方式呈现:

@Styles.Render("~/Content/styles/jquery-ui")

我可以看到请求发送到:

http://localhost/MySite/Content/styles/jquery-ui?v=nL_6HPFtzoqrts9nwrtjq0VQFYnhMjY5EopXsK8cxmg1

这将返回正确的,缩小的CSS响应。但是随后浏览器发送一个请求,要求一个相对链接的图像,如下所示:

http://localhost/MySite/Content/styles/images/ui-bg_highlight-soft_100_eeeeee_1x100.png

这是一个404

我知道我URL的最后一部分jquery-ui是无扩展名URL,这是我的包的处理程序,因此我可以看到为什么对图像的相对请求很简单/styles/images/

所以我的问题是处理这种情况的正确方法什么

猴子L2020/03/23 21:22:33

CssRewriteUrlTransform解决了我的问题。
如果使用后您的代码仍不加载图像CssRewriteUrlTransform,则将css文件名更改为:

.Include("~/Content/jquery/jquery-ui-1.10.3.custom.css", new CssRewriteUrlTransform())

至:

.Include("~/Content/jquery/jquery-ui.css", new CssRewriteUrlTransform())

某种程度上,。(点)无法在url中识别。

斯丁前端2020/03/23 21:22:33

您可以简单地在虚拟捆绑包路径中添加另一级别的深度

    //Two levels deep bundle path so that paths are maintained after minification
    bundles.Add(new StyleBundle("~/Content/css/css").Include("~/Content/bootstrap/bootstrap.css", "~/Content/site.css"));

这是一种技术含量极低的答案,有点像骇客,但它可以正常工作,不需要任何预处理。考虑到其中一些答案的篇幅和复杂性,我更喜欢这样做。

斯丁2020/03/23 21:22:33

经过很少的调查,我得出以下结论:您有2个选择:

  1. 进行转换。为此非常有用的软件包:https : //bundletransformer.codeplex.com/, 您需要对每个有问题的包进行以下转换:

    BundleResolver.Current = new CustomBundleResolver();
    var cssTransformer = new StyleTransformer();
    standardCssBundle.Transforms.Add(cssTransformer);
    bundles.Add(standardCssBundle);
    

优点:使用此解决方案,您可以根据需要命名捆绑软件=>可以将CSS文件从不同目录组合到一个捆绑软件中。缺点:您需要转换每个有问题的包

  1. 使用相同的相对根作为捆绑包的名称,例如css文件所在的位置。优点:无需改造。缺点:在将来自不同目录的css工作表组合到一个包中时,存在局限性。
神乐飞云2020/03/23 21:22:33

另一个选择是使用IIS URL重写模块将虚拟包映像文件夹映射到物理映像文件夹。下面是一个重写规则的示例,可以将其用于名为“〜/ bundles / yourpage / styles”的包-请注意,正则表达式与字母数字字符以及连字符,下划线和句点匹配,这在图像文件名中很常见。

<rewrite>
  <rules>
    <rule name="Bundle Images">
      <match url="^bundles/yourpage/images/([a-zA-Z0-9\-_.]+)" />
      <action type="Rewrite" url="Content/css/jquery-ui/images/{R:1}" />
    </rule>
  </rules>
</rewrite>

这种方法会产生一些额外的开销,但可以让您更好地控制捆绑软件名称,还可以减少一页上可能需要引用的捆绑软件数量。当然,如果必须引用多个包含相对图像路径引用的第三方css文件,则仍然无法创建多个捆绑包。

古一Eva2020/03/23 21:22:33

我发现如果您引用*.css文件并且关联*.min.css文件位于同一文件夹中,则CssRewriteUrlTransform无法运行

要解决此问题,请删除*.min.css文件或直接在包中引用它:

bundles.Add(new Bundle("~/bundles/bootstrap")
    .Include("~/Libs/bootstrap3/css/bootstrap.min.css", new CssRewriteUrlTransform()));

之后,您的URL将正确转换并且图像应正确解析。

Itachi2020/03/23 21:22:32

根据MVC4 CSS捆绑和图片参考上的该线程,如果将捆绑定义为:

bundles.Add(new StyleBundle("~/Content/css/jquery-ui/bundle")
                   .Include("~/Content/css/jquery-ui/*.css"));

如果您在与构成包的源文件相同的路径上定义包,则相对映像路径仍将起作用。捆绑软件路径的最后一部分实际上是file name该特定捆绑软件的(即,/bundle可以是您喜欢的任何名称)。

仅当您将同一文件夹中的CSS捆绑在一起时才有效(从捆绑的角度来看,我认为这很有意义)。

更新资料

根据@Hao Kung的以下评论,现在也可以通过应用CssRewriteUrlTransformation绑定时更改CSS文件的相对URL引用)来实现

注意:我尚未确认有关重写虚拟目录中绝对路径问题的注释,因此可能不适用于所有人(?)。

bundles.Add(new StyleBundle("~/Content/css/jquery-ui/bundle")
                   .Include("~/Content/css/jquery-ui/*.css",
                    new CssRewriteUrlTransform()));