C# MVC4-当优化设置为true时,绑定不起作用
我不知道我在这里有什么不正确的地方。我正在使用ASP.NET C#MVC4,我想使用新的css/js优化功能 这是我的HTML部分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",
@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错误的东西:
- 仅供参考:我的目录结构是
,其中包含用于CSS图像的Content/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>