繁体   English   中英

当我打开发布模式时,捆绑在 MVC5 中不起作用

[英]Bundling not working in MVC5 when I turn on release mode

我在 BundleConfig.cs 中配置了以下捆绑包:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/assets/bootstrap/css/bootstrap.css",
                      "~/assets/css/global/all.css"));

我使用以下内容引用它:

@Styles.Render("~/bundles/css")

当我处于调试模式(web.config 编译debug="true" )时,它按预期工作,因为它将两个 css 文件都呈现为正常,即:

<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>

但是,当我设置debug="false"时,仍然会出现上述行为,因为它确实识别了文件,但是它只是将它们呈现为正常。

为了确认捆绑绝对可以工作,我在 BundleConfig 中启用了优化,即BundleTable.EnableOptimizations = true;

每当我执行上述操作时,它都会捆绑 css 并按预期显示,即:

<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>

编辑:

一些人提到将以下代码添加到我的 BundleConfig.cs 文件将实现我所追求的:

#if DEBUG
            BundleTable.EnableOptimizations = false;
#else
            BundleTable.EnableOptimizations = true;
#endif

我理解并欣赏这种响应,但是根据文档,MVC 捆绑的默认行为是在发布模式下捆绑,而不是在调试模式下捆绑。 我不明白为什么我应该添加额外的代码来让它在它应该已经这样做的时候做到这一点。

编辑 2

我要坦白。 事实证明,我打开了 Views 文件夹中的 web.config,而不是主 web.config。 我更改了主 web.config 中的设置,这对我来说很好。 我责怪 ReSharper

这是默认行为。

通过在 Web.config 文件的编译元素中设置调试属性的值来启用或禁用捆绑和缩小。

http://www.asp.net/mvc/overview/performance/bundling-and-minification

在此处输入图像描述

我解决这个问题的方法是在BundleConfig中强制它完全按照我想要的方式执行。 我不认为 MVC4 与配置文件有相同的选项(或者我只是从来没有让它们工作)。

所以这就是我在 RegisterBundles 方法结束时所拥有的:

#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif

这样它就一直在那里,一目了然。 但是,您必须记住在启动项目时将其放在那里,但这并不是什么大不了的事。

如果您不熟悉这些, #if DEBUG是一个预处理器指令,它告诉 CLR 在存在 DEBUG 构建参数时执行该块中的内容(应该只在 DEBUG 模式下存在,尽管可以从项目属性)。 如果该变量不存在(发布模式或任何其他模式),那么它将执行另一个块。

默认的 Release Web.config 转换会删除调试属性,如下所示:

<compilation xdt:Transform="RemoveAttributes(debug)" />

但是,这不会导致发生预期的捆绑行为。 相反,您必须创建一个将调试属性设置为“false”的转换,如下所示:

<compilation debug="false" xdt:Transform="SetAttributes" />

另一个可能的问题是,在Application_Start()方法中的Global.asax.cs文件中,您缺少对BundleConfig的调用。

例如,假设您的方法使用默认名称RegisterBundles(BundleCollection bundles)然后在Global.asax.cs文件中,您需要添加BundleConfig.RegisterBundles(BundleTable.Bundles); Application_Start()方法中。

所以你的Global.asax.cs文件可能看起来像这样:

using System;
using System.Collection.Generic;
using System.Linq;
using System.Web;
using System.Http;
using System.Mvc;
using System.Routing;
using System.Optimization;

namespace MyProject
{
    public class MvcApplication : System.Web.HttpApplication
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        // ** This line right below might be what you are missing **
        BundleConfig.RegisterBundles(BundleTable.Bundles);

    }
}

当我更改 css 文件夹时,我遇到了这个问题。 我的问题是我更改了 CSS 文件的 BundleConfig 文件:

BundleConfig.cs:

bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/css/bootstrap.css",
   ....

包括的观点:

@Styles.Render("~/Content/css")

由于某种原因,这没有奏效。 'bundles' 似乎是一个关键字或其他东西(不确定)。 你必须这样离开它:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/Content/css/bootstrap.css", ...

意见:

...
@Styles.Render("~/bundles/css")
...

我不需要修改 'BundleTable.EnableOptimizations' 或 web.config 或其他任何东西。

希望这可以帮助某人。

在与这个问题斗争了几个小时之后,我建议你也试试这个:

  1. 在你正在使用你的包的视图的最开始添加这个:

    @{ BundleTable.EnableOptimizations = true; }

  2. 重置 IIS

  3. 重新加载您的页面并检查缩小是否有效

在我的情况下,我的解决方案中的某个地方将“BundleTable.EnableOptimizations”从真更改为假。 当我在使用捆绑包之前强制它为 TRUE 时,我得到了这个工作。

在我注意到它有效之后,我将它移到了我的 BundleConfig 类的静态方法中:

public static void EnableOptimizations()
{
    #if DEBUG
        BundleTable.EnableOptimizations = false;
    #else
        BundleTable.EnableOptimizations = true;
    #endif
}

所以我可以从视图中调用它并为开发人员禁用它

@{
    BundleConfig.EnableOptimizations();
}

确保您的 BundleConfig 类中没有任何缩小文件,例如bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/js/popper.min.js"));

而是使用bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/js/popper.js"));

除了所有其他回复之外,如果您仍然无法捆绑您的 CSS 和 JS 文件,请确保您正在处理正确的路径和/或文件夹/文件名。

在我的情况下,我正在处理的一些文件实际上丢失了,有些在寻址时有拼写错误。 更正这些事情后,捆绑包应该可以正常工作。

最后,如果您通过 CSS 或 JS 文件(例如url(../../css/img/loading.gif) )上的相对路径进行引用,您可能希望将它们转换为绝对路径(例如url(/Content/css/img/loading.gif) ) 否则即使文件已成功捆绑,它们也不会工作或呈现。 bundle 中的相对路径从浏览器的角度显示了差异。

<compilation debug="true" targetFramework="4.5.2" />

解决我的问题。 发布时我的 Web 配置中缺少debug=true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM