Come aggiungere riferimento a System.Web.Optimization per l'app MVC-3-convert-to-4


458

Sto cercando di utilizzare la nuova funzionalità di raggruppamento in un progetto che ho recentemente convertito da MVC 3 a MVC 4 beta. Richiede una riga di codice in global.asax BundleTable.Bundles.RegisterTemplateBundles();, che richiede using System.Web.Optimization;nella parte superiore.

Quando lo faccio, ottengo le linee rosse che indicano "Ti manca un riferimento all'assemblaggio?" Quando provo ad aggiungere riferimenti e faccio clic sulla scheda .NET nella finestra di dialogo, ordina dalla A alla Z, non vedo System.Web.Optimization.

Come faccio ad aggiungere questo riferimento al mio progetto?


6
Avevo già l'ottimizzazione ma stava causando un problema con ScriptBundle che potevo risolvere solo dopo aver disinstallato Opti ... quindi reinstallandolo.
Myzifer,

1
@Myzifer Dovresti inviare il tuo commento come risposta. È stata l'unica cosa che ha funzionato per me riportare il System.Web.Optimizationnodo nei miei riferimenti.
Snekse,

2
@myzifer La tua risposta è quella corretta per questo strano comportamento. L' unica cosa che potrebbe risolvere questo problema per me è l'esecuzione della riga cmd di nuget: UnInstall-Package Microsoft.AspNet.Web.Optimization e quindi subito dopo l'esecuzione dell'installazione: Install-Package Microsoft.AspNet.Web.Optimization. Ho provato a farlo funzionare per settimane sul mio computer di casa con VStudio 2013 e non ci sono mai riuscito. Grazie mille.
Raddevus,

@Myzifer - ha funzionato anche per me - "Ho controllato" un progetto da VSOnline e ho avuto questo errore - disinstalla quindi reinstalla - 20 secondi di lavoro - grazie - questo è uno di quegli stupidi problemi che puoi facilmente perdere un giorno!
Percy,

Risposte:


728


È disponibile l' aggiornamento versione 1.1.x, leggi le note di rilascio: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Il pacchetto Microsoft.Web.Optimization è ora obsoleto. Con ASP.NET (MVC) 4 e versioni successive è necessario installare Microsoft ASP.NET Web Optimization Framework:

  • Installa il pacchetto da nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Crea e configura bundle in 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")
            );
        }
    }
  • Chiama la funzione RegisterBundles () da Application_Start () in global.asax.cs:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • Nel tuo view.cshtml includi lo spazio dei nomi di ottimizzazione e renderizza i bundle:

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

Vedere http://www.asp.net/mvc/overview/performance/bundling-and-minification per ulteriori informazioni


2
Hai bisogno di MVC4 per usare questo?
FloatLeft l'

5
Non è obsoleto. Ecco come lo uso con le versioni finali di Visual Studio 2012 e ASP.NET (MVC) 4.
mhu,

29
La tua risposta include "using System.Web.Optimization;", che è esattamente ciò di cui l'interrogatore sta chiedendo.
davidpricedev,

9
@dave: è buono o cattivo? Per risolvere il "riferimento di assembly mancante", è necessario installare Microsoft.AspNet.Web.Optimization come indicato nella risposta.
Mhu,

6
nel modello MVC predefinito ho potuto usare la classe Scripts senza aggiungere lo spazio dei nomi System.Web.Optimization nella parte superiore della pagina. Ma nel mio progetto viene visualizzato l'errore "il nome Script non esiste". Come posso risolverlo? L'aggiunta di questo spazio dei nomi in web.config non ha aiutato. Modifica: la ricarica della soluzione ha aiutato, scusa :)
Wachburn,

83

Con la versione finale rilasciata di ASP.Net MVC 4 l'approccio è il seguente:

  • Installa Microsoft.AspNet.Web.Optimization tramite nuget (poiché non è installato dal framework)

    install-package Microsoft.AspNet.Web.Optimization
  • Crea il pacchetto in Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Aggiungi lo spazio dei nomi "System.Web.Optimization" al web.config "Views":

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • Nel tuo view.cshtml aggiungi un'inclusione al bundle creato nell'ultimo passaggio:

    @Scripts.Render("~/MyBundle")

In modalità debug, tutti i file di script nella directory verranno visualizzati singolarmente; in modalità di rilascio saranno raggruppati e minimizzati.


Corretto, questa versione lo include. L'altra versione no.
Luke Belbina,

1
Non riesco a capire perché questo non funzioni per me. Ho provato sia in questo modo che per creare il bundle in BundleConfig.cs ma quando aggiungo @ Styles.Render ("~ / CssBundle") a mio avviso tutto ciò che ottengo è <link href = "/ CssBundle" rel = "foglio di stile "/> che mi dà 404. Qualche idea sul perché?
vsdev,

@vsdev So che sono in ritardo di 4 anni, ma potresti dover controllare BundleConfig.cs per essere sicuro di aggiungerlo correttamente: la riga in questa risposta fa riferimento solo ai ".js"file. All'interno public static void RegisterBundles(BundleCollection bundles) { ... }dovresti essere in grado di fare qualcosa del genere bundles.Add(new StyleBundle("~/CssBundle"));e prenderebbe tutti i file CSS nella tua CssBundlecartella. Non vuoi ScriptBundlecome ha fatto nell'esempio per i file CSS.
vapcguy,

17

Aggiorna (reinstalla) il pacchetto da nuget, puoi usare il comando:

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


14

Nel mio caso si è trattato di un problema di tfs, poiché tfs esclude i binari, quindi Nugget PM trova il nugget installato e non aggiorna la libreria Se hai un problema simile:

  • Vai al controllo del codice sorgente
  • Passare a .. \ pacchetti \ Microsoft.Web.Optimization
  • Aggiungi cartella lib (deseleziona le estensioni binarie di esclusione)
  • Aggiorna la tua soluzione e aggiungi il riferimento dll dal percorso

NB: la cartella del pacchetto si trova nello stesso livello del file yousolution.sln


11

Utilizzando nuget per disinstallare System.Web.Optimization nella console del gestore pacchetti in questo modo:

Pacchetto di disinstallazione Microsoft.AspNet.Web.Optimization

Quindi reinstallare utilizzando:

Pacchetto di installazione Microsoft.AspNet.Web.Optimization

Può risolvere questo problema per te.


1
Non sei sicuro di come questo risponda alla domanda?
TylerD87,

@ TylerD87 Semplice risolve un particolare insieme di circostanze e non sono il solo a trovare questo caso, se leggi i commenti sulla domanda noterai che Snekse ha detto il 29 aprile 14 alle 16:39 che dovevano seguire le istruzioni particolari che ho dato e che sotto qualcun altro ha pubblicato lo stesso molto più tardi ed è stato votato.
Myzifer,

Forse modifica la tua risposta in modo che assomigli di più a una risposta? Non avevo nemmeno capito che stavi rispondendo alla domanda o cosa stavi suggerendo.
TylerD87,

@ TylerD87 La domanda riguardava l'ottimizzazione e la mia risposta era sull'ottimizzazione, risolve il problema dettagliato nella domanda ed è stata riconosciuta da almeno altri 2, se offri dettagli su come hai capito male la mia risposta e come meglio Potrei alterarlo / modificarlo per fornire a un pubblico più ampio una risposta più chiara, quindi sarei felice di apportare tali cambiamenti, ma senza critiche costruttive non sono in grado di determinare come potrei migliorare.
Myzifer,

Ciao, ho suggerito una modifica che rende più chiaro a cosa mi riferivo. Dopo aver letto i commenti in alto, vedo che questo è in realtà il suggerimento che ha funzionato, ma il modo in cui è stata presentata la tua risposta non era chiaro su ciò che stavi effettivamente suggerendo.
TylerD87,

6

Installalo da NUGet tramite Visual Studio Apri Visual Studio 2010, seleziona Strumenti-> Library Package Manager-> Package Manager Console

Questo aprirà il coslve, incolla

Install-Package Microsoft.AspNet.Web.Optimization 

ed entra. e il gioco è fatto


2

impostato in Global.asax application_start (in modalità RELEASE ecc.):

BundleTable.EnableOptimizations = **true**;

per abilitare la minimizzazione e passare a false in modalità DEBUG per eseguire il rendering di tutti i file di script e di stile singolarmente.


5
È più facile controllarlo tramite web.config. Se <compilation debug="true" />è impostato (che è piuttosto standard quando si costruisce una versione di debug), non ha luogo alcuna ottimizzazione. Normalmente questa impostazione viene automaticamente rimossa in una build di rilascio. BundleTable.EnableOptimizationsdovrebbe essere usato solo per sovrascrivere web.config. Per maggiori informazioni: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (cerca "Controlling Bundling and Minification")
mhu

Questo mi ha aiutato moltissimo, grazie. Ho dovuto disabilitarlo perché lavorare con dotless + RequestReduce stava rendendo i pacchetti confusi.
siva.k,

Questa impostazione dipende davvero se stai usando file pre-minimizzati nei tuoi bundle, o se stai usando file non minimizzati - non tanto se sei in Debug o Release, tranne per le migliori pratiche per ognuna di quelle modalità - es. , puoi avere un progetto che stai compilando in modalità Debug, ma dove hai BundleTable.EnableOptimizations = false;perché nel tuo BundleConfig.cs, stai specificando tutti i file pre-minimizzati e non vuoi che esegua un'altra minimizzazione su di essi.
vapcguy,

Questa sarebbe davvero la risposta al problema di qualcuno se usassero file non pre-minimizzati (cioè file SENZA .min) nel loro BundleConfig.cs. Se usassero i file .min e lo impostassero su true, avrebbero dei problemi.
vapcguy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.