C# MVC4-当优化设置为true时,绑定不起作用

C# MVC4-当优化设置为true时,绑定不起作用,c#,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-optimization,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Optimization,我不知道我在这里有什么不正确的地方。我正在使用ASP.NET C#MVC4,我想使用新的css/js优化功能 这是我的HTML部分 @Styles.Render("~/content/css") 这是我的BunduleConfig.cs部分 bundles.Add(new StyleBundle("~/content/css").Include( "~/content/css/reset.css",

我不知道我在这里有什么不正确的地方。我正在使用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;
产出(工程):


这当然是404。我不知道我哪里做错了什么,请帮助我,第一次使用MVC4。

这对我来说是正确的。启用优化后,您将只有一个ref,它将用于您在样式包(/content/css)中指定的名称。在调试模式下(或者更具体地说,在web配置中使用debug=false),您将正常获得未优化的文件。如果你看一下,你会发现当你输入它们时,它们只是纯文本。然而,当优化打开时(通常是在发布模式下运行时),您将得到一个看起来像wierd的URL

如果你看一下它的输出,它会缩小。查询字符串?v=5KLoJ。。。。基于捆绑包中文件的哈希值。这样,只要您愿意,引用就可以被安全地HTTP缓存。永远,如果你愿意,但我认为默认是一年。但是,如果您修改任何样式表,它将生成一个新的哈希,这就是“缓存破坏”,因此您将在浏览器上获得一个新的副本


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

我想问题是您将捆绑包放在一个实际存在的虚拟URL上,但它是一个目录

MVC从您的捆绑包生成一个虚拟文件,并从您指定为捆绑包路径的路径提供它

该问题的正确解决方案是使用不直接映射到现有目录的捆绑路径,而是在该目录内使用虚拟文件名(也不映射到真实文件名)

例如:

如果您的站点有一个名为/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")

请注意,这是假设您的css文件夹中没有名为AllMyCss.css的文件。

我不确定是web优化还是Webfleed如此挑剔,但其中一个(或两个)非常挑剔,您需要非常小心

首先,您的代码没有任何问题:

bundles.Add(new StyleBundle("~/content/css").Include(
                        "~/content/css/reset.css",
                        "~/content/css/bla.css"));
事实上,这正是微软所做的。他们不为css使用
~/bundles
的主要原因是图像的相对路径被弄乱了。想想你的浏览器是如何看待一个捆绑包的——与它看待任何其他URL的方式完全相同,所有与路径相关的常规规则仍然适用于相对路径。假设您的css有一个指向
。/images/bullet.png
的图像路径。如果您使用的是
~/bundles
,浏览器将在
bundles
上方的目录中查找,该目录实际上并不存在。它可能会在
~/images
中查找,您可能会在
~/content/images
中找到它

我发现了一些可以真正破坏它并导致404错误的东西:

  • 仅供参考:我的目录结构是
    Content/CSS
    ,其中包含用于CSS图像的
    images
    文件夹
  • 我有
    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"));
这将在HTML中生成指向此路径的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
且没有扩展名的文件)

另外一个技巧是,您需要确保生成的HTML具有版本号

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

如果没有,并且看起来像这样,那么您的bundle表和cshtml文件中的bundle名称可能不完全匹配

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

我刚刚解决了一个类似的问题。问题如下,我通过
NuGet
安装了“selected”。 在
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(new StyleBundle("~/Content/css").Include(
                            "~/Content/site.css", 
                            "~/Content/chosen.css"
                        ));

这为我解决了问题。

别忘了确保捆绑式HttpModule在那里

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


这是我第一次感到刺痛。不确定NuGet包是否应该添加必要的配置,但我的情况不是这样。

这也可能是因为您出于某种原因没有将bundleconfig.json部署到服务器。

我正在使用ASP.NET开发服务器(用于测试/调试的集成服务器)运行VS2010。您是否调用EnableDefaultBundles()?否则,您的URL听起来好像无法通过—请尝试将应用程序池的模式更改为“集成”。如果创建EnableOptimizations=true要查找的~content/css/reset.min.css和bla.min.css文件,会发生什么情况?我刚刚创建了一个空项目,并尝试了两个
css
文件,结果还是一样。也许是因为我把css文件放在了
/content/css/
文件夹中,而不仅仅是
/content/
,但我怀疑……把包放在一个不存在的目录中不会导致css中的相对引用出现问题吗?解决相对参考问题的方法很多。如果css中有相对引用,可以将它们转换为绝对引用,将资源嵌入到css中,将相对引用视为css文件本身位于virt
bundles.Add(new StyleBundle("~/Content/css").Include(
                            "~/Content/site.css", 
                            "~/Content/chosen.css"
                        ));
<modules>  
  <remove name="BundleModule" />  
  <add name="BundleModule" type="System.Web.Optimization.BundleModule" />  
</modules>