Cómo agregar referencias a System.Web.Optimization para la aplicación MVC-3-convert-to-4

458

Estoy tratando de usar la nueva función de agrupación en un proyecto que convertí recientemente de MVC 3 a MVC 4 beta. Requiere una línea de código en global.asax BundleTable.Bundles.RegisterTemplateBundles();, que requiere using System.Web.Optimization;en la parte superior.

Cuando hago esto, obtengo las líneas onduladas rojas que dicen: "¿Te falta una referencia de ensamblaje?" Cuando intento agregar una referencia y hago clic en la pestaña .NET en el cuadro de diálogo, ordenar desde AZ, no veo System.Web.Optimization.

¿Cómo agrego esta referencia a mi proyecto?

Ian Davis
fuente
66
Ya tenía Optimización, pero estaba causando un problema con el ScriptBundle que solo pude resolver después de desinstalar Opti ... luego reinstalarlo.
Myzifer
1
@Myzifer Debes enviar tu comentario como respuesta. Fue lo único que funcionó para mí para recuperar el System.Web.Optimizationnodo en mis referencias.
Snekse
2
@myzifer Su respuesta es la correcta para este comportamiento extraño. Lo único que resolvería este problema para mí es ejecutar la línea nuget cmd: UnInstall-Package Microsoft.AspNet.Web.Optimization y luego, inmediatamente después de ejecutar la instalación: Install-Package Microsoft.AspNet.Web.Optimization. Intenté hacer que esto funcionara durante semanas en la computadora de mi casa con VStudio 2013 y nunca pude conseguirlo. Muchas gracias.
raddevus
@Myzifer - también funcionó para mí - "Desprotegí" un proyecto de VSOnline y tuve este error - desinstalar y luego reinstalar - 20 segundos de trabajo - gracias - ¡este es uno de esos problemas estúpidos que fácilmente puede perder un día!
Percy

Respuestas:

728

La
versión de actualización 1.1.x está disponible, lea las notas de la versión: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


El paquete Microsoft.Web.Optimization ahora está obsoleto. Con ASP.NET (MVC) 4 y superior, debe instalar Microsoft ASP.NET Web Optimization Framework:

  • Instale el paquete desde nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Cree y configure paquetes en 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")
            );
        }
    }
  • Llame a la función RegisterBundles () desde Application_Start () en su global.asax.cs:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • En su view.cshtml incluya el espacio de nombres de Optimización y renderice los paquetes:

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

Consulte http://www.asp.net/mvc/overview/performance/bundling-and-minification para obtener más información.

mhu
fuente
2
¿Necesitas MVC4 para usar esto?
FloatLeft
55
No está desactualizado. Así es como lo uso con las versiones finales de Visual Studio 2012 y ASP.NET (MVC) 4.
mhu
29
Su respuesta incluye "usar System.Web.Optimization;", que es exactamente lo que el interlocutor pregunta.
davidpricedev
99
@dave: ¿Eso es bueno o malo? Para resolver la "referencia de ensamblaje faltante", Microsoft.AspNet.Web.Optimization debe instalarse como se menciona en la respuesta.
mhu
66
en la plantilla MVC predeterminada, podría usar la clase Scripts sin agregar el espacio de nombres System.Web.Optimization en la parte superior de la página. Pero en mi proyecto recibo el error "el nombre Scripts no existe". ¿Cómo puedo resolver eso? Agregar este espacio de nombres en web.config no ayudó. Editar: la solución de recarga ayudó, lo siento :)
Wachburn
83

Con la versión final lanzada de ASP.Net MVC 4, el enfoque es el siguiente:

  • Instale Microsoft.AspNet.Web.Optimization a través de nuget (ya que el marco no lo instala)

    install-package Microsoft.AspNet.Web.Optimization
  • Cree el paquete en Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Agregue el espacio de nombres "System.Web.Optimization" al "Vistas" web.config:

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • En su view.cshtml agregue una inclusión al paquete creado en el último paso:

    @Scripts.Render("~/MyBundle")

En modo de depuración, todos los archivos de script en su directorio se renderizarán individualmente; en el modo de lanzamiento serán agrupados y minificados.

Noel Abrahams
fuente
Correcto, esta versión lo incluye. La otra versión no.
Luke Belbina
1
No puedo entender por qué esto no funciona para mí. Lo intenté de esta manera y para crear el paquete en BundleConfig.cs, pero cuando agrego @ Styles.Render ("~ / CssBundle") en mi vista, todo lo que obtengo es <link href = "/ CssBundle" rel = "stylesheet "/> eso me da 404. ¿Alguna idea de por qué?
vsdev
@vsdev Sé que esto es 4 años demasiado tarde, pero es posible que tenga que verificar su BundleConfig.cs para asegurarse de que lo está agregando correctamente: la línea en esta respuesta solo hace referencia a ".js"archivos. En el interior public static void RegisterBundles(BundleCollection bundles) { ... }, deberías poder hacer algo así bundles.Add(new StyleBundle("~/CssBundle"));y tomaría todos los archivos CSS de tu CssBundlecarpeta. No desea ScriptBundleque tenga en el ejemplo para archivos CSS.
vapcguy
17

Actualice (reinstale) el paquete desde nuget, puede usar el comando:

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

M. Salah
fuente
14

En mi caso, fue un problema de tfs, ya que tfs excluye binarios, por lo que el PM de Nugget encuentra el nugget instalado y no actualiza la biblioteca. Si tiene un problema similar:

  • Ir al control de fuente
  • Vaya a .. \ packages \ Microsoft.Web.Optimization
  • Agregar carpeta lib (desmarque las extensiones binarias excluir)
  • Actualice su solución y agregue la referencia dll de la ruta

NB: la carpeta del paquete está en el mismo nivel del archivo yousolution.sln

amina
fuente
11

Usando nuget para desinstalar System.Web.Optimization en la consola del administrador de paquetes de esta manera:

Paquete de desinstalación Microsoft.AspNet.Web.Optimization

Luego reinstalar usando:

Install-Package Microsoft.AspNet.Web.Optimization

Puede resolver este problema por ti.

Myzifer
fuente
1
¿No está seguro de cómo responde esto a la pregunta?
TylerD87
@ TylerD87 Simple resuelve un conjunto particular de circunstancias y no soy el único que descubrió que este es el caso, si lees los comentarios sobre la pregunta, notarás que Snekse dijo el 29 de abril de 2014 a las 16:39 que tenían que seguir las instrucciones particulares que di y que debajo alguien más publicó lo mismo mucho más tarde y fue votado.
Myzifer
¿Quizás edite su respuesta para que parezca más una respuesta? Ni siquiera me di cuenta de que estabas respondiendo la pregunta o lo que estabas sugiriendo.
TylerD87
@ TylerD87 La pregunta fue sobre Optimización y mi respuesta fue sobre Optimización, resuelve el problema detallado en la pregunta y ha sido reconocido por al menos otros 2, si ofreciera detalles sobre cómo ha entendido mal mi respuesta y cuál es la mejor manera Podría alterarlo / enmendarlo para proporcionar a un público más amplio una respuesta más clara, entonces estaría feliz de hacer tales cambios, pero sin una crítica constructiva no puedo determinar cómo podría mejorar.
Myzifer
Hola, he sugerido una edición que aclara a qué me refería. Después de leer los comentarios en la parte superior, veo que esta es realmente la sugerencia que funcionó, pero la forma en que se presentó su respuesta no estaba clara sobre lo que realmente estaba sugiriendo.
TylerD87
6

Instálelo desde NUGet a través de Visual Studio Abra Visual Studio 2010, seleccione Herramientas-> Biblioteca Package Manager-> Package Manager Console

Esto abrirá el conslve, pega

Install-Package Microsoft.AspNet.Web.Optimization 

y entra. y ya terminaste

Mian
fuente
2

establecido en Global.asax application_start (en modo RELEASE, etc.):

BundleTable.EnableOptimizations = **true**;

para habilitar la minificación y cambiar a falso en modo DEPURAR para representar todos los archivos de script y de estilo individualmente.

zenichi
fuente
55
Es más fácil controlar esto a través de web.config. Si <compilation debug="true" />se establece (que es bastante estándar cuando se crea una versión de depuración), no se realiza ninguna optimización. Normalmente, esta configuración se elimina automáticamente en una versión de lanzamiento. BundleTable.EnableOptimizationssolo debe usarse para anular el archivo web.config. Para más información: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (busque "Controlling Bundling and Minification")
mhu
Esto me ayudó mucho, gracias. Tuve que desactivarlo porque trabajar con dotless + RequestReduce estaba haciendo que los paquetes se complicaran.
siva.k
Esta configuración realmente depende de si está usando archivos preminificados en sus paquetes, o si está usando archivos no minificados, no tanto si está en Debug o Release, excepto por las mejores prácticas para cada uno de esos modos, por ejemplo. , puede tener un proyecto que está compilando en modo de depuración, pero donde lo tiene BundleTable.EnableOptimizations = false;porque en su BundleConfig.cs, está especificando todos los archivos preminificados y no desea que haga otra minimización en ellos.
vapcguy
Esto realmente solo sería la respuesta al problema de alguien si estuviera usando archivos no minimizados previamente (es decir, archivos SIN .min) en su BundleConfig.cs. Si usaran archivos .min y lo configuraran como verdadero, tendría problemas.
vapcguy