当优化设置为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一个实际上不存在的目录。 它可能最终会在~/images
find你可能拥有的~/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" ));
那为我修好了