当优化设置为true时,MVC4 – Bundling不起作用

我想知道我在这里做的不对。 我正在使用ASP.NET C#MVC4,我想利用新的CSS / JS优化function。

这是我的HTML部分

@Styles.Render("~/content/css") 

这是我的BunduleConfig.cs部分

 bundles.Add(new StyleBundle("~/content/css").Include( "~/content/css/reset.css", "~/content/css/bla.css")); // BundleTable.EnableOptimizations = true; 

输出(工作):

 <link href="/content/css/reset.css" rel="stylesheet"/> <link href="/content/css/bla.css" rel="stylesheet"/> 

但是,当我取消注释BundleTable.EnableOptimizations = true; html输出看起来像这样

 <link href="/content/css?v=5LoJebKvQJIN-fKjKYCg_ccvmBC_LF91jBasIpwtUcY1" rel="stylesheet"/> 

这当然是404.我不知道我做错了什么地方,请帮忙,第一次使用MVC4。

我想象的问题是你把包放在一个真正存在的虚拟URL,但是一个目录。

MVC正在从你的包中创build一个虚拟文件,并从你指定的包path中提供它。

正确的解决scheme是使用不直接映射到现有目录的捆绑包path,而是在该目录内使用虚拟文件名(也不映射到真实文件名)。

例:

如果您的网站有一个名为/ content / css的文件夹,请按如下所示制作您的CSS套件:

在BundleConfig.cs中:

 bundles.Add(new StyleBundle("~/content/css/AllMyCss.css").Include( "~/content/css/reset.css", "~/content/css/bla.css")); 

并在页面上:

 @Styles.Render("~/content/css/AllMyCss.css") 

请注意,这假定你没有一个名为AllMyCss.css在你的css文件夹中的文件。

我不确定它是否是Web优化,或WebGrease如此挑剔,但它们中的一个(或两个)都是,你需要非常小心。

首先,你的代码没有问题:

 bundles.Add(new StyleBundle("~/content/css").Include( "~/content/css/reset.css", "~/content/css/bla.css")); 

事实上,这正是微软所做的。 他们使用~/bundles的CSS的主要原因是相对path搞砸的图像。 考虑一下浏览器如何看待一个包 – 就像看到其他URL一样,所有正常path相关的规则仍然适用于相对path。 想象一下,你的CSS有一个图像path..http://img.dovov.combullet.png 。 如果你正在使用~/bundles那么浏览器将会在~/bundles的上面find一个实际上不存在的目录。 它可能最终会在~/imagesfind你可能拥有的~/content/images

我发现了几件事情,可以真正打破它,并导致404错误:

  • 仅供参考:我的目录结构是Content/CSS ,其中包含CSS图像的images文件夹。
  • 我有EnableOptimizations=true在testing时强制使用包
  • 你应该做的第一件事是'查看源代码',只需点击CSS链接,看看他们是否工作

假设我们正在开发一个关于猫的网站。 你可能有这个

  @Styles.Render("~/Content/css/cats.css") // dont do this - see below why bundles.Add(new StyleBundle("~/content/css/cats.css").Include( "~/content/css/reset.css", "~/content/css/bla.css")); 

这会在您的HTML中生成一个到此path的CSS链接:

 /Content/css/cats.css?v=JMoJspikowDah2auGQBfQAWj1OShXxqAlXxhv_ZFVfQ1 

但是这会给404一个,因为我把一个扩展名.css和IIS(我认为)变得困惑。

如果我改变它,然后它工作正常:

  @Styles.Render("~/Content/css/cats") bundles.Add(new StyleBundle("~/content/css/cats").Include( "~/content/css/reset.css", "~/content/css/bla.css")); 

别人已经指出的另一个问题是你不能这样做

  @Styles.Render("~/Content/css") 

如果你有一个css目录或文件(不太可能你会有一个名为css文件,没有扩展名)在你的Content目录中。

另一个窍门是,你需要确保你生成的HTML有一个版本号

 <link href="/Content/css/cats?v=6GDW6wAXIN5DJCxVtIkkxLGpojoP-tBQiKgBTQMSlWw1" rel="stylesheet"/> 

如果它不是,看起来像这样,那么你的Bundle表和你的cshtml文件之间的bundle名称可能没有完全匹配。

 <link href="/Content/css/cats" rel="stylesheet"/> 

不要忘记确保绑定HttpModule在那里。

 <modules> <remove name="BundleModule" /> <add name="BundleModule" type="System.Web.Optimization.BundleModule" /> </modules> 

这刺痛了我第一次。 不知道NuGet软件包是否应该添加必要的configuration,但不是我的情况。

这对我来说是正确的。 当启用优化时,您将只有一个参考,它将用于您在StyleBundle(/ content / css)中指定的名称。 在debugging模式下(或者更具体地说,在你的webconfiguration文件中debug = false),你会得到非优化的文件。 如果你看,你会看到他们只是纯文本input他们。 但是,当开启优化(通常是在发布模式下运行时),您会看到一个看起来很奇怪的URL。

如果你看看它的输出,它会被缩小。 查询string?v = 5KLoJ ….是基于捆绑中文件的哈希值。 这是为了使引用可以安全地HTTPcaching,只要你想。 永远如果你喜欢,但我认为默认是一年。 但是,如果您修改了任何样式表,它将生成一个新的散列,这就是“caching破坏”,因此您将在浏览器上获得全新的副本。

说了这么多,我不知道你为什么得到404。我怀疑这与你的路由configuration或你的IIS设置有关。 你是否在Visual Studio中运行IISExpress?

我刚刚解决了类似的问题。 问题是如下,我通过NuGet安装“select”。 在BundleConfig类中,包含CSS文件的行如下所示:

 bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css",)); bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/chosen.css")); 

有些地方在那个class上我有这条线:

 BundleTable.EnableOptimizations = true; 

解决的办法是结合2 bundles.Add()像这样:

 bundles.Add(new StyleBundle("~/Content/css").Include( "~/Content/site.css", "~/Content/chosen.css" )); 

那为我修好了