为什么我的CSS捆绑无法使用bin部署的MVC4应用程序?

Pro*_*ofK 66 asp.net-mvc asp.net-mvc-4 asp.net-optimization

我根据这里给出的建议和一两个即时修复,将bin部署了一个MVC4应用程序给我的托管服务提供商,但最明显的问题是css的捆绑不起作用.当我用显式文件refs替换bundle ref时,我的css再次工作.

我正在使用VS2012的标准MVC4 RTM项目模板.提供程序运行IIS 7.5和ASP.NET 4,我以前的同一个应用程序的MVC3版本工作正常.我猜我已经抓住了一个版本太低的依赖,这也可能导致我的基于区域的动作链接问题.

技术症状是:

该行@Styles.Render("~/Content/css")呈现为<link href="/Content/css?v=" rel="stylesheet"/>

cde*_*sch 80

更新2013年11月4日:

发生这种情况的原因是因为您在包名称末尾有.js.css会导致ASP.NET无法通过MVC和BundleModule运行请求.

修复此问题以获得更好性能的推荐方法是从包名称中删除.js.css.

所以/bundle/myscripts.js成为/ bundle/myscripts

或者,您可以修改system.webServer部分中的web.config以通过BundleModule运行这些请求(这是我原来的答案)

<modules runAllManagedModulesForAllRequests="true">
  <remove name="BundleModule" />
  <add name="BundleModule" type="System.Web.Optimization.BundleModule" />
</modules>
Run Code Online (Sandbox Code Playgroud)

编辑:我也注意到,如果名称以'css'结尾(没有点),那也是一个问题.我不得不将我的包名称从'DataTablesCSS'更改为'DataTablesStyles'来解决我的问题.

  • 我还没有在其他任何地方看过这个.我试图捆绑Server 2008/IIS 7/.NET 4,这正是缺少的. (9认同)
  • 谢谢!这是唯一对我有用的东西.BTW这对我来说也适用于runAllManagedModulesForAllRequests ="false".我很想知道为什么我需要这个. (4认同)
  • 这个解决方案最终解决了我的问题! (3认同)
  • CDeutsch - 你是我的英雄.我不知道该怎么感谢你才足够.在我的情况下,问题是样式包名称以css(您的编辑注释)结尾.除了将名称更改为"mystyles"而不是"mycss"之外,我不必做任何其他修正. (3认同)

Nic*_*cht 76

无论.NET是运行4.0还是4.5,CSS和脚本捆绑都应该有效.我正在运行.NET 4.0,它对我来说很好.但是,为了使缩小和捆绑行为起作用,必须将web.config设置为不在调试模式下运行.

<compilation debug="false" targetFramework="4.0">
Run Code Online (Sandbox Code Playgroud)

将此包用于_Layout.cshtml文件中的jQuery UI示例.

@Styles.Render("~/Content/themes/base/css")
Run Code Online (Sandbox Code Playgroud)

如果我运行,debug="true"我得到以下HTML.

<link href="/Content/themes/base/jquery.ui.core.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.resizable.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.selectable.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.accordion.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.autocomplete.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.button.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.dialog.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.slider.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.tabs.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.datepicker.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.progressbar.css" rel="stylesheet"/>
<link href="/Content/themes/base/jquery.ui.theme.css" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

但如果我一起跑debug="false".我会得到这个.

<link href="/Content/themes/base/css?v=myqT7npwmF2ABsuSaHqt8SCvK8UFWpRv7T4M8r3kiK01" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

这是一项功能,因此您可以轻松调试脚本和CSS文件的问题.我正在使用MVC4 RTM.

如果您认为它可能是MVC依赖性问题,我建议您进入Nuget并删除所有与MVC相关的软件包,然后搜索该Microsoft.AspNet.Mvc软件包并进行安装.我正在使用最新版本,它将在v.4.0.20710.0上发布.这应该抓住你需要的所有依赖项.

此外,如果您曾经使用过MVC3并且现在正在尝试使用MVC4,那么您将需要进入web.config并更新其引用以指向MVC的4.0版本.如果您不确定,可以随时创建一个全新的MVC4应用程序并从那里复制web.config.如果这样做,请不要忘记Views/Areas文件夹中的web.config.

更新:我发现您需要的是Microsoft.AspNet.Web.Optimization项目中安装的Nuget包.默认情况下,它包含在MVC4 RTM应用程序中,无论您将目标框架指定为4.5还是4.0.这是捆绑类所包含的命名空间,并且似乎不依赖于框架.我已经部署到没有安装4.5的服务器,它仍然按预期工作.只需确保DLL与应用程序的其余部分一起部署.

  • 当我右键单击要部署到Azure的项目时,如果Settings - > Configuration设置为'Release',那么我的css将被权限阻止.如果我设置为"调试",我的网站正确加载....奇怪. (3认同)

Hao*_*ung 12

只是为了澄清一些事情,System.Web.Optimization(即捆绑/缩小)将对4.0起作用.它不依赖于4.5中的任何东西,所以那里应该没有问题.

如果脚本捆绑工作正常,并且它只是CSS的一个问题,那么问题可能是相对URL?

我首先看看渲染页面,看看你是否得到了CSS包的引用,例如:

<link href="/app/Content/css?v=oI5uNwN5NWmYrn8EXEybCI" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

如果你是,那么捆绑工作正在运行,但你的CSS包中的东西搞砸了.通常这是由于CSS包中的相对URL不正确,即如果您的图像位于〜/ Content下,但是您为包命名~/bundles/css,浏览器将错误地查找下面的图像~/bundles.

此外,默认行为是禁用捆绑和缩小时debug=true.因此,如果您确实希望启用优化debug=true,则需要强制:

BundleTable.EnableOptimizations = true
Run Code Online (Sandbox Code Playgroud)

更新:使用新信息v="",即捆绑包为空,您应该验证是否正确地将文件添加到捆绑包中,并且它已找到它们.你如何将文件包含在捆绑包中?

  • 我在生成的链接中的'v =`之后没有得到数字. (3认同)

Kur*_*urt 10

省略runAllManagedModulesForAllRequests="true"也对我有用.在以下位置添加以下配置web.config:

<modules>
  <remove name="BundleModule" />
  <add name="BundleModule" type="System.Web.Optimization.BundleModule" />
</modules>
Run Code Online (Sandbox Code Playgroud)

runAllManagedModulesForAllRequests如果使用不当,将对您的网站造成性能损失.看看这篇文章.