MVC4 - 当优化设置为true捆绑不起作用(MVC4 - Bundling does not

2019-06-17 23:38发布

我不知道我没有做正确的位置。 我正在使用ASP.NET C#MVC4,我想利用使用新的CSS / JS优化功能。

这是我的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工作。

Answer 1:

我想这个问题是你把捆在实际存在的虚拟URL,但它是一个目录。

MVC是从您的包制作的虚拟文件,并从指定的束路径的目录服务不起来。

对于此问题的正确解决方案是使用不直接映射到现有的目录束路径,而是使用一个虚拟文件名(也不会映射到一个真正的文件名)目录中。

例:

如果您的网站有一个文件夹命名为/内容/ 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")

注意,这里假设你没有在你的CSS文件夹命名AllMyCss.css文件。



Answer 2:

我不知道这是否是网络优化,或者WebGrease就是这么挑剔,但他们中的一个(或两者),你必须非常小心。

首先,没有什么不对您的代码:

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

事实上,这是微软做什么。 他们使用的主要原因~/bundles对CSS是相对路径得到搞砸了的图像。 想想你的浏览器是如何对待束 - 正是因为它看到任何其他的URL以同样的方式,所有的正常路径相关规则仍然相对于相对路径适用。 想象一下,你的CSS不得不成像路径../images/bullet.png 。 如果您正在使用~/bundles的浏览器将寻找在上面的目录bundles ,它实际上并不存在。 它最终可能会寻求在~/images ,你可能有它在~/content/images

我发现一对夫妇的事情,真的可以打破它,并导致404错误:

  • FYI:我的目录结构是Content/CSS其中包含一个images的CSS图片文件夹中。
  • 我有EnableOptimizations=true强制使用,而测试束
  • 你应该做的第一件事是“查看源文件”,只是点击链接的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"));

这会产生一个CSS链接到你的HTML路径:

/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"/>

如果没有,看起来像这样,那么你可能没有你的包桌之间,并在您CSHTML文件包名称完全匹配。

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


Answer 3:

不要忘记,以确保捆绑的HttpModule是存在的。

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

这周围刺痛了我的第一次。 不知道,如果必要的配置应该由NuGet包进行添加,但它不是我的情况。



Answer 4:

这看起来正确的给我。 启用优化时你只有一个单一的裁判,它会成为你在StyleBundle(/内容/ CSS)指定的名称。 在调试模式(或者更具体的调试=假在你的web配置),您将获得非优化的文件是正常的。 如果你看看,你会看到他们只是纯文本键入他们。 然而,当optimzations被开启(通常,当你在释放模式运行),你会得到一个奇怪的看着URL来代替。

如果你看一下,它会精缩的输出。 查询字符串?V = 5KLoJ ....是基于文件的包采取的哈希值。 这是使参考可以安全HTTP缓存只要你想要的。 永远如果你喜欢,但我觉得默认的是一年。 但是,如果您修改任何样式表中就会产生一个新的哈希值,这就是“缓存清除”所以你会得到浏览器上的全新副本。

说了这么多,我不知道为什么你得到一个404。我怀疑这事做你的路由配置或您的IIS设置。 你在Visual Studio中运行与IISExpress?



Answer 5:

我只是解决了类似的问题。 问题是如下,我装经由“选择” NuGet 。 而在BundleConfig类,即包括行CSS文件是这样的:

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

一些在该类我有这条线在哪里了下来:

BundleTable.EnableOptimizations = true;

此修复程序是在2相结合bundles.Add()像这样:

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

和固定对我来说。



Answer 6:

它也可能是因为你还没有部署bundleconfig.json到服务器出于某种原因。



文章来源: MVC4 - Bundling does not work when optimizations are set to true