Como adicionar referência ao System.Web.Optimization para o aplicativo MVC-3 convertido em 4

458

Estou tentando usar o novo recurso de agregação em um projeto que converti recentemente do MVC 3 para o MVC 4 beta. Requer uma linha de código em global.asax BundleTable.Bundles.RegisterTemplateBundles();, que requer using System.Web.Optimization;no topo.

Quando faço isso, recebo as linhas onduladas vermelhas que dizem: "Está faltando uma referência de montagem?" Quando tento adicionar referência e clico na guia .NET na caixa de diálogo, digite AZ, não vejo System.Web.Optimization.

Como adiciono esta referência ao meu projeto?

Ian Davis
fonte
6
Eu já tinha o Optimization, mas estava causando um problema com o ScriptBundle, que eu só conseguia resolver após desinstalar o Opti ... e reinstalá-lo.
Myzifer
1
@Myzifer Você deve enviar seu comentário como resposta. Foi a única coisa que funcionou para que eu System.Web.Optimizationretornasse o nó às minhas referências.
Snekse
2
@myzifer Sua resposta é a correta para esse comportamento estranho. A única coisa que resolveria esse problema para mim seria executar a linha cmd do nuget: UnInstall-Package Microsoft.AspNet.Web.Optimization e depois executar a instalação: Install-Package Microsoft.AspNet.Web.Optimization. Tentei fazer isso funcionar por semanas no meu computador doméstico com o VStudio 2013 e nunca consegui. Muito obrigado.
Raddevus 19/07/2015
@Myzifer - trabalhou para mim também - "Fiz o check-out" de um projeto do VSOnline e tive esse erro - desinstale e reinstale - 20segundo trabalho - obrigado - este é um daqueles problemas estúpidos que você pode perder facilmente por dia!
Percy

Respostas:

728

A
versão de atualização 1.1.x está disponível, leia as notas de versão: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


O pacote Microsoft.Web.Optimization agora está obsoleto. Com o ASP.NET (MVC) 4 e superior, você deve instalar o Microsoft ASP.NET Web Optimization Framework:

  • Instale o pacote do nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Crie e configure pacotes em App_Start \ BundleConfig.cs:

    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")
            );
        }
    }
  • Chame a função RegisterBundles () de Application_Start () em seu global.asax.cs:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • Em seu view.cshtml, inclua o espaço para nome Otimização e renderize o (s) pacote (s):

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

Consulte http://www.asp.net/mvc/overview/performance/bundling-and-minification para obter mais informações.

mhu
fonte
2
Você precisa do MVC4 para usar isso?
FloatLeft
5
Não está desatualizado. É assim que eu o uso nos lançamentos finais do Visual Studio 2012 e do ASP.NET (MVC) 4. #
3100
29
Sua resposta inclui "using System.Web.Optimization;", que é exatamente o que o interlocutor está perguntando.
Davidpricedev
9
@ Dave: Isso é bom ou ruim? Para resolver a "referência de assembly ausente", o Microsoft.AspNet.Web.Optimization deve ser instalado conforme mencionado na resposta.
Mh #
6
no modelo MVC padrão, eu poderia usar a classe Scripts sem adicionar o espaço para nome System.Web.Optimization na parte superior da página. Mas no meu progect eu recebo o erro "o nome Scripts não existe". Como posso resolver isso? Adicionar este espaço para nome no web.config não ajudou. Editar: solução de recarga ajudou, desculpe :)
Wachburn
83

Com a versão final lançada do ASP.Net MVC 4, a abordagem é a seguinte:

  • Instale Microsoft.AspNet.Web.Optimization via nuget (como ele não é instalado pela estrutura)

    install-package Microsoft.AspNet.Web.Optimization
  • Crie o pacote configurável no Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Adicione o espaço para nome "System.Web.Optimization" ao web.config "Views":

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • Em seu view.cshtml, inclua uma inclusão no pacote criado na última etapa:

    @Scripts.Render("~/MyBundle")

No modo de depuração, todos os arquivos de script em seu diretório serão renderizados individualmente; no modo de lançamento, eles serão agrupados e minificados.

Noel Abrahams
fonte
Correto, esta versão inclui. A outra versão não.
27412 Luke Belbina
1
Não consigo entender por que isso não funciona para mim. Eu tentei dessa maneira e criar o pacote no BundleConfig.cs, mas quando adiciono @ Styles.Render ("~ / CssBundle") na minha visualização, tudo o que recebo é <link href = "/ CssBundle" rel = "folha de estilo "/> isso me dá 404. Alguma idéia do porquê?
vsdev
@vsdev Eu sei que isso é 4 anos tarde demais, mas talvez você precise verificar o seu BundleConfig.cs para ter certeza de que está adicionando corretamente - a linha nesta resposta está apenas referenciando ".js"arquivos. Dentro de public static void RegisterBundles(BundleCollection bundles) { ... }você deve ser capaz de fazer algo assim bundles.Add(new StyleBundle("~/CssBundle"));e ele pegaria todos os arquivos CSS em sua CssBundlepasta. Você não quer ScriptBundlecomo no exemplo de arquivos CSS.
precisa saber é
17

Atualize (reinstale) o pacote do nuget, você pode usar o comando:

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

M. Salah
fonte
14

No meu caso, foi um problema do tfs, pois o tfs exclui os binários; portanto, o Nugget PM encontra o nugget instalado e não atualiza a biblioteca. Se você tiver um problema semelhante:

  • Ir para o controle de origem
  • Navegue para .. \ packages \ Microsoft.Web.Optimization
  • Adicionar pasta lib (desmarque as extensões binárias de exclusão)
  • Atualize sua solução e adicione a referência de DLL do caminho

Nota: a pasta do pacote está no mesmo nível do arquivo yousolution.sln

amina
fonte
11

Usando o nuget para desinstalar o System.Web.Optimization no console do gerenciador de pacotes assim:

Pacote de desinstalação Microsoft.AspNet.Web.Optimization

Em seguida, reinstalando usando:

Pacote de instalação Microsoft.AspNet.Web.Optimization

Pode resolver esse problema para você.

Myzifer
fonte
1
Não sabe ao certo como isso responde à pergunta?
precisa saber é o seguinte
@ TylerD87 Simples, ele resolve um conjunto específico de circunstâncias e eu não sou o único que considerou esse o caso, se você ler os comentários sobre a pergunta, verá que Snekse disse em 29 de abril de 14 às 16:39 que eles precisavam seguir as instruções específicas que eu dei e que abaixo alguém postou a mesma coisa muito mais tarde e foi votado.
Myzifer 4/09/15
Talvez edite sua resposta para parecer mais uma resposta? Eu nem percebi que você estava respondendo à pergunta ou ao que estava sugerindo.
precisa saber é o seguinte
@ TylerD87 A pergunta era sobre otimização e minha resposta era sobre otimização, resolve o problema detalhado na pergunta e foi reconhecida por pelo menos mais duas pessoas, se você oferecesse detalhes sobre exatamente como você não entendeu minha resposta e qual a melhor forma Eu poderia alterá-lo / alterá-lo para fornecer uma resposta mais clara a um público mais amplo. Ficaria feliz em fazer essas alterações, mas sem críticas construtivas, não sou capaz de determinar como posso melhorar.
Myzifer 4/09/15
Olá, sugeri uma edição que torna mais claro o que eu estava me referindo. Depois de ler os comentários no topo, vejo que essa é realmente a sugestão que funcionou, mas a maneira como sua resposta foi apresentada não era clara sobre o que você estava realmente sugerindo.
TylerD87 4/15
6

Instale-o do NUGet através do Visual Studio Abra o Visual Studio 2010, selecione Ferramentas-> Gerenciador de Pacotes de Biblioteca-> Console do Gerenciador de Pacotes

Isso abrirá o conslve, cole

Install-Package Microsoft.AspNet.Web.Optimization 

e entre. e você terminou

Mian
fonte
2

defina no Global.asax application_start (no modo RELEASE etc.):

BundleTable.EnableOptimizations = **true**;

para ativar a minificação e alterar para false no modo DEBUG para renderizar todos os arquivos de script e estilo individualmente.

zenichi
fonte
5
É mais fácil controlar isso através do web.config. Se <compilation debug="true" />estiver definido (o que é bastante padrão ao criar uma versão de depuração), nenhuma otimização ocorre. Normalmente, essa configuração é removida automaticamente em uma compilação de versão. BundleTable.EnableOptimizationsdeve ser usado apenas para substituir o web.config. Para mais informações: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (procure por "Controle Agrupamento e Minification")
mhu
Isso me ajudou muito, obrigado. Eu tive que desativá-lo porque trabalhar com o + RequestReduce sem pontos estava fazendo com que os pacotes bagunçasse distorcido.
Siva.k 17/03/14
Essa configuração realmente depende se você estiver usando arquivos pré-minificados em seus pacotes configuráveis ​​ou se você estiver usando arquivos não-minificados - nem tanto se estiver em Debug ou Release, exceto pelas práticas recomendadas para cada um desses modos - ex. , você pode ter um projeto que está compilando no modo Debug, mas onde está, BundleTable.EnableOptimizations = false;porque no BundleConfig.cs está especificando todos os arquivos pré-minificados e não deseja que ele faça outra minimização.
precisa saber é
Isso realmente seria a resposta para o problema de alguém se eles estivessem usando arquivos não pré-minimizados (ou seja, arquivos SEM .min) em seus BundleConfig.cs. Se eles usassem arquivos .min e o definissem como true, haveria problemas.
precisa saber é