ASP.NET MVC 4应用程序使用捆绑和缩小功能,为什么在调试模式下会启用缩小功能?

20

我刚将一个ASP.NET MVC 3项目迁移到MVC 4/.NET 4.0,并安装了NuGet包Microsoft.AspNet.Web.Optimization以支持CSS和JavaScript的捆绑和缩小。我已经基本掌握了捆绑/缩小的工作,但问题是它总是启用的。即使应用程序处于调试模式(如Web.config中配置的那样),所有JavaScript包括都被缩小。从下面的XML片段可以看出,Web.config中启用了调试模式:

<system.web>
  <compilation debug="true" targetFramework="4.0">
    ...
  </compilation>
  ...
</system.web>

我的Bundle配置摘录:

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        ...

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-1.*",
                    "~/Scripts/jquery.form.js",
                    "~/Scripts/jquery.format.js"));

        bundles.Add(new StyleBundle("~/Content/css").Include(
            "~/Content/Site.css"));

        ...
    }
}

CSS/JavaScript包含会呈现在HTML中,例如:

<link href="/content/css" rel="stylesheet" type="text/css">
<script src="/bundles/jquery" type="text/javascript"></script>

有人知道为什么在我的情况下启用了代码缩小吗?我不知道我错过了什么。为了进行故障排除,我创建了一个测试ASP.NET MVC 4互联网应用程序,并且可以验证此项目的调试模式下未对CSS/JavaScript进行缩小。

编辑:

在我的_Layout.cshtml文件中,我是这样呈现样式/脚本的:

@Styles.Render("content/css")
@Scripts.Render("bundles/jquery")

感谢Hao,我意识到我忘记在捆绑名称前加上“〜/”。


这个问题可能会有所帮助。如何在ASP.NET MVC 4中禁用JavaScript/CSS最小化 - jrummell
@jrummell 那个问题的答案似乎是无条件禁用缩小?我只想让标准的有条件缩小工作。 - aknuds1
2个回答

17

你的HTML中渲染的链接/脚本标签存在问题,需要加上版本哈希码,如果你正在使用Script/Style.Render。

< script src="/bundles/jquery?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"/>
为了达到 MVC4 模板所使用的调试/发布行为,你必须同时使用 Script/Style.Render 方法。在调用这些方法时,你必须传递虚拟捆绑包路径,例如在你的示例中:
要获得 MVC4 模板所使用的调试/发布行为,您必须使用 Script/Style.Render 方法。在调用这些方法时,请传递虚拟捆绑包路径,例如,在您的示例中:
@Styles.Render("~/content/css")
@Scripts.Render("~/bundles/jquery")
在调试模式下,您不应该获取指向捆绑包(将始终被缩小/捆绑)的链接/脚本标签。相反,在调试模式下,您应该获取指向各个资源的脚本/链接标签。

1
谢谢。但是如果没有提供虚拟路径,@Scripts.Render(...)不应该抛出异常吗?什么时候会想要写@Scripts.Render(“/ bundles / jquery”),即没有“〜”? - Zephyr was a Friend of Mine
它不仅限于捆绑URL,它们还将呈现脚本/链接标记到任意URL(相对和绝对)。长期的想法是让这些助手处理资产管理,而不仅仅是捆绑特定的助手。 - Hao Kung
1
好的,谢谢你澄清。但是今天我们浪费了半天时间,因为有人忘记输入“~”。 - Zephyr was a Friend of Mine
@HaoKung,您能否查看一下这个问题:https://dev59.com/nHLYa4cB1Zd3GeqPbLkB - Oxon

2

我在一个全新的ASP.NET MVC项目中遇到了这个问题。我在web.config中设置了<compilation debug="true" targetFramework="4.5.1" />,但仍然得到了压缩输出。

解决方法

BundleConfig.cs(位于App_Start中)底部有一行BundleTable.EnableOptimizations = true;,它覆盖了我的web.config设置...

删除该行和/或将其设置为false,我就可以在调试环境下获得未压缩/未捆绑的脚本。

我建议删除该行,因为它会覆盖web.config。在web.config中设置此项的优点是使用web.config转换,以便您可以为不同的环境创建不同的设置。

有关更多信息,请参见http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification并阅读控制捆绑和最小化部分(文章约在中间位置)。


1
这对我来说是个问题,似乎 BundleConfig.cs 的默认模板在某个时候发生了变化。我确定以前从来没有出现过这种情况。 - ScottGuymer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接