我不知道我没有做正确的位置。 我正在使用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工作。
我想这个问题是你把捆在实际存在的虚拟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文件。
我不知道这是否是网络优化,或者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"/>
不要忘记,以确保捆绑的HttpModule是存在的。
<modules>
<remove name="BundleModule" />
<add name="BundleModule" type="System.Web.Optimization.BundleModule" />
</modules>
这周围刺痛了我的第一次。 不知道,如果必要的配置应该由NuGet包进行添加,但它不是我的情况。
这看起来正确的给我。 启用优化时你只有一个单一的裁判,它会成为你在StyleBundle(/内容/ CSS)指定的名称。 在调试模式(或者更具体的调试=假在你的web配置),您将获得非优化的文件是正常的。 如果你看看,你会看到他们只是纯文本键入他们。 然而,当optimzations被开启(通常,当你在释放模式运行),你会得到一个奇怪的看着URL来代替。
如果你看一下,它会精缩的输出。 查询字符串?V = 5KLoJ ....是基于文件的包采取的哈希值。 这是使参考可以安全HTTP缓存只要你想要的。 永远如果你喜欢,但我觉得默认的是一年。 但是,如果您修改任何样式表中就会产生一个新的哈希值,这就是“缓存清除”所以你会得到浏览器上的全新副本。
说了这么多,我不知道为什么你得到一个404。我怀疑这事做你的路由配置或您的IIS设置。 你在Visual Studio中运行与IISExpress?
我只是解决了类似的问题。 问题是如下,我装经由“选择” 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"
));
和固定对我来说。
它也可能是因为你还没有部署bundleconfig.json到服务器出于某种原因。