如何为从MVC 3转换为4的应用程序添加对System.Web.Optimization的引用

461

我试图在最近从MVC 3升级到MVC 4 beta的项目中使用新的绑定功能。它需要在global.asax中添加一行代码:BundleTable.Bundles.RegisterTemplateBundles();,并在顶部添加using System.Web.Optimization;

当我这样做时,我会看到红色波浪线,提示“您是否缺少程序集引用?” 当我尝试添加引用并在对话框中点击.NET选项卡并按A-Z排序时,我没有看到System.Web.Optimization

如何将此引用添加到我的项目中?


7
我已经安装了优化插件,但是它与脚本捆绑包存在问题,只有在卸载优化插件后才能解决这个问题,然后重新安装它。 - Myzifer
2
@Myzifer 你应该将你的评论提交为答案。这是唯一让我成功将 System.Web.Optimization 节点重新加入到我的引用中的方法。 - Snekse
2
@myzifer 你的答案对于这个奇怪的行为是正确的。唯一能解决我的问题的事情是运行nuget命令行:UnInstall-Package Microsoft.AspNet.Web.Optimization,然后紧接着运行安装命令:Install-Package Microsoft.AspNet.Web.Optimization。在我家里使用VStudio 2013试图让它工作了几周,但是从来没有成功。非常感谢。 - raddevus
@Myzifer - 对我也起作用了 - 从VSOnline“检出”一个项目时遇到了这个错误 - 卸载然后重新安装 - 只需20秒钟的工作 - 谢谢 - 这是那种你可能会浪费一整天时间的愚蠢问题之一! - Percy
7个回答

738

更新
现在可以获取1.1.x版本,请阅读发布说明:https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Microsoft.Web.Optimization包现已过时。对于ASP.NET(MVC)4和更高版本,您应该安装Microsoft ASP.NET Web Optimization Framework:

  • nuget安装包:

  • Install-Package Microsoft.AspNet.Web.Optimization
    
  • 在 App_Start\BundleConfig.cs 中创建和配置 bundle(束):

  • public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles) {
            bundles.Add(new ScriptBundle("~/Scripts/jquery").Include(
                "~/Scripts/Lib/jquery/jquery-{version}.js",
                "~/Scripts/Lib/jquery/jquery.*",
                "~/Scripts/Lib/jquery/jquery-ui-{version}.js")
            );
    
            bundles.Add(new ScriptBundle("~/Scripts/knockout").Include(
                 "~/Scripts/Lib/knockout/knockout-{version}.js",
                 "~/Scripts/Lib/knockout/knockout-deferred-updates.js")
            );
        }
    }
    
  • 在您的global.asax.cs中从Application_Start()调用RegisterBundles()函数:

  • using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
    
  • 在你的view.cshtml中包含Optimization命名空间并渲染bundle(s):

  • @using System.Web.Optimization
    
    @Scripts.Render("~/Scripts/jquery")
    @Scripts.Render("~/Scripts/knockout")
    

更多信息请查看http://www.asp.net/mvc/overview/performance/bundling-and-minification


2
你需要使用MVC4来使用它吗? - FloatLeft
5
不过时,这是我在使用最终版本的Visual Studio 2012和ASP.NET(MVC)4中的用法。 - mhu
29
你的回答包含了 "using System.Web.Optimization;",这正是问题提出者所询问的内容。 - davidpricedev
10
@dave:那是好的还是坏的?为了解决“丢失程序集引用”的问题,需要按照答案中提到的安装Microsoft.AspNet.Web.Optimization。 - mhu
6
在默认的MVC模板中,我可以使用Scripts类而无需在页面顶部添加System.Web.Optimization命名空间。但是在我的项目中,我遇到了错误“名称Scripts不存在”。我该如何解决这个问题?将这个命名空间添加到web.config中并没有起作用。编辑:重新加载解决方案可以解决问题,抱歉 :) - Wachburn
显示剩余6条评论

83

使用最终发布版本的ASP.Net MVC 4,方法如下:

  • 通过NuGet安装Microsoft.AspNet.Web.Optimization(因为该框架未安装此项)。

install-package Microsoft.AspNet.Web.Optimization
在 Global.asax 文件的 Application_Start 方法中创建 bundle:
  • Create the bundle in Global.asax Application_Start:

  • var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
    
    将 "System.Web.Optimization" 命名空间添加到 "Views" Web.config 文件中:
     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
    
  • 在你的view.cshtml中添加一个引用到上一步创建的bundle:

  • @Scripts.Render("~/MyBundle")
    
    在调试模式下,你目录中的所有脚本文件都会单独呈现;在发布模式下,它们将被捆绑和压缩。

    正确的,这个版本包括了它。另一个版本没有。 - Luke Belbina
    1
    我不明白为什么这对我不起作用。我尝试了这种方式和在BundleConfig.cs中创建bundle,但是当我在视图中添加@Styles.Render(“〜/ CssBundle”)时,我得到的只是<link href =“/ CssBundle”rel =“stylesheet”/>,这给了我404。有任何想法吗? - Misbit
    @vsdev 我知道这已经晚了4年,但你可能需要检查一下你的BundleConfig.cs文件,确保你正确地添加了它 - 这个答案中的行只引用了".js"文件。在public static void RegisterBundles(BundleCollection bundles) { ... }内部,你应该能够做类似于bundles.Add(new StyleBundle("~/CssBundle"));的事情,并且它会获取你的CssBundle文件夹中的所有CSS文件。你不想像示例中那样使用ScriptBundle来处理CSS文件。 - vapcguy

    17

    从 nuget 更新(重新安装)软件包,可以使用以下命令:

    update-Package Microsoft.AspNet.Web.Optimization -reinstall


    14

    针对我的问题,这是一个tfs问题,因为tfs排除了二进制文件,所以Nugget PM发现已经安装的nugget库,无法更新该库。

    • 进入源代码控制
    • 导航到..\packages\Microsoft.Web.Optimization
    • 添加lib文件夹(取消勾选排除二进制扩展名)
    • 更新你的解决方案并从该路径添加dll引用

    注意:包文件夹与您的solution.sln文件在同一级别。


    12

    使用NuGet在包管理器控制台中卸载System.Web.Optimization,格式如下:

    Uninstall-Package Microsoft.AspNet.Web.Optimization

    然后使用以下命令重新安装:

    Install-Package Microsoft.AspNet.Web.Optimization

    可能会解决你的问题。


    1
    不确定这怎么回答问题? - TylerD87
    @TylerD87,它解决了一组特定的情况,而且不仅我发现这种情况,如果你阅读问题的评论,你会注意到Snekse在2014年4月29日16:39说他们也需要遵循我给出的特定指示,并且在下面有人发布了类似的内容,后来得到了赞同。 - Myzifer
    也许编辑一下你的答案,让它看起来更像一个回答?我甚至没有意识到你在回答问题或者在建议什么。 - TylerD87
    @TylerD87 这个问题是关于优化的,而我的回答也是关于优化的。它解决了问题中详细描述的问题,并已得到至少其他两个人的确认。如果你能详细说明你如何误解了我的答案,以及我应该如何修改/修正它才能为更广泛的观众提供更清晰的答案,那么我很乐意进行这样的改变。但是,没有建设性的批评,我无法确定如何改进。 - Myzifer
    嗨,我建议了一项编辑,使得我的意思更加清晰明了。在阅读了顶部的评论后,我发现这实际上是起作用的建议,但你的回答表述不够清晰,无法明确你实际上在建议什么。 - TylerD87
    我明白你的意思,我的先前回答并不像我想象中那么具体或直接。当我发布答案时,它更像是一个附加信息,假设由于安装代码已在问题/其他早期答案中涵盖,因此不必详细介绍。虽然这对于评论来说足够了,但并不是一个真正的回答。 - Myzifer

    6

    通过Visual Studio从NUGet安装它 打开Visual Studio 2010,选择工具->库包管理器->包管理器控制台

    这将打开控制台,请粘贴

    Install-Package Microsoft.AspNet.Web.Optimization 
    

    输入回车,完成操作。


    2
    在Global.asax的application_start方法中设置(在RELEASE模式下等):
    BundleTable.EnableOptimizations = **true**;
    

    要启用缩小并在DEBUG模式下将其更改为false,以单独呈现所有脚本和样式文件。


    6
    通过 web.config 更容易控制此设置。如果设置了 <compilation debug="true" />(在构建调试版本时非常常见),则不会进行任何优化。通常在发布生成中,此设置会自动删除。BundleTable.EnableOptimizations 应仅用于覆盖 web.config 的设置。更多信息请参阅:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification(搜索 "Controlling Bundling and Minification")。 - mhu
    这对我帮助很大,谢谢。我不得不禁用它,因为使用dotless + RequestReduce会使捆绑包变得混乱无序。 - siva.k
    这个设置取决于你是否在捆绑包中使用预先压缩的文件,或者是否使用未压缩的文件 - 与你是处于调试模式还是发布模式关系不大,除了每种模式的最佳实践 - 例如,你可以在调试模式下编译项目,但是在BundleConfig.cs中指定了所有预先压缩的文件,并且你不希望它再次对它们进行压缩。 - vapcguy
    只有当某人在他们的BundleConfig.cs中使用非预先最小化的文件(即没有.min文件)时,这才是解决方案。如果他们使用.min文件并将其设置为true,则会出现问题。 - vapcguy

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