So fügen Sie einen Verweis auf System.Web.Optimization für die MVC-3-konvertierte-zu-4-App hinzu

458

Ich versuche, die neue Bündelungsfunktion in einem Projekt zu verwenden, das ich kürzlich von MVC 3 auf MVC 4 Beta konvertiert habe. Es erfordert eine Codezeile in global.asax BundleTable.Bundles.RegisterTemplateBundles();, die oben benötigt wird using System.Web.Optimization;.

Wenn ich das mache, bekomme ich die roten, schnörkellosen Linien, die sagen: "Fehlt Ihnen eine Baugruppenreferenz?" Wenn ich versuche, eine Referenz hinzuzufügen und im Dialogfeld auf die Registerkarte .NET zu klicken, nach AZ sortieren, wird dies nicht angezeigt System.Web.Optimization.

Wie füge ich diesen Verweis meinem Projekt hinzu?

Ian Davis
quelle
6
Ich hatte bereits die Optimierung, aber es verursachte ein Problem mit dem ScriptBundle, das ich erst nach der Deinstallation von Opti beheben und dann neu installieren konnte.
Myzifer
1
@ Myzifer Sie sollten Ihren Kommentar als Antwort einreichen. Es war das einzige, was für mich funktioniert hat, um den System.Web.OptimizationKnoten wieder in meine Referenzen aufzunehmen.
Snekse
2
@myzifer Deine Antwort ist die richtige für dieses seltsame Verhalten. Das einzige, was dieses Problem für mich beheben würde, ist das Ausführen der cmd-Zeile nuget: UnInstall-Package Microsoft.AspNet.Web.Optimization und anschließend direkt die Installation: Install-Package Microsoft.AspNet.Web.Optimization. Ich habe versucht, dies mit VStudio 2013 wochenlang auf meinem Heimcomputer zum Laufen zu bringen und konnte es nie bekommen. Vielen Dank.
Raddevus
@Myzifer - hat auch für mich gearbeitet - hat ein Projekt von VSOnline "ausgecheckt" und hatte diesen Fehler - deinstallieren und dann neu installieren - 20 Sekunden Job - danke - dies ist eines dieser dummen Probleme, an die Sie leicht einen Tag verlieren können!
Percy

Antworten:

728

Update
Version 1.1.x ist verfügbar. Lesen Sie die Versionshinweise: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Das Microsoft.Web.Optimization-Paket ist jetzt veraltet. Ab ASP.NET (MVC) 4 sollten Sie das Microsoft ASP.NET Web Optimization Framework installieren:

  • Installieren Sie das Paket von Nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Erstellen und konfigurieren Sie Bundles 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")
            );
        }
    }
  • Rufen Sie die Funktion RegisterBundles () von Application_Start () in Ihrer Datei global.asax.cs auf:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • Fügen Sie in Ihre view.cshtml den Optimierungs-Namespace ein und rendern Sie die Bundles:

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

Weitere Informationen finden Sie unter http://www.asp.net/mvc/overview/performance/bundling-and-minification

mhu
quelle
2
Benötigen Sie MVC4, um dies zu verwenden?
FloatLeft
5
Es ist nicht veraltet. So verwende ich es mit den endgültigen Versionen von Visual Studio 2012 und ASP.NET (MVC) 4.
mhu
29
Ihre Antwort beinhaltet "using System.Web.Optimization;", genau das, worüber der Fragesteller fragt.
Davidpricedev
9
@ Dave: Ist das gut oder schlecht? Um die "fehlende Assemblyreferenz" zu beheben, sollte Microsoft.AspNet.Web.Optimization wie in der Antwort angegeben installiert werden.
mhu
6
In der Standard-MVC-Vorlage konnte ich die Scripts-Klasse verwenden, ohne den System.Web.Optimization-Namespace oben auf der Seite hinzuzufügen. Aber in meinem Projekt erhalte ich die Fehlermeldung "Der Name Scripts existiert nicht". Wie kann ich das lösen? Das Hinzufügen dieses Namespace in web.config hat nicht geholfen. Bearbeiten: Nachladen Lösung geholfen, sorry :)
Wachburn
83

Mit der endgültigen veröffentlichten Version von ASP.Net MVC 4 ist der Ansatz wie folgt:

  • Installieren Sie Microsoft.AspNet.Web.Optimization über Nuget (da es nicht vom Framework installiert wird).

    install-package Microsoft.AspNet.Web.Optimization
  • Erstellen Sie das Bundle in Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Fügen Sie den Namespace "System.Web.Optimization" zur web.config "Views" hinzu:

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • Fügen Sie in Ihrer view.cshtml dem im letzten Schritt erstellten Bundle ein Include hinzu:

    @Scripts.Render("~/MyBundle")

Im Debug-Modus werden alle Skriptdateien in Ihrem Verzeichnis einzeln gerendert. Im Release-Modus werden sie gebündelt und minimiert.

Noel Abrahams
quelle
Richtig, diese Version enthält es. Die andere Version nicht.
Luke Belbina
1
Ich kann nicht verstehen, warum das bei mir nicht funktioniert. Ich habe sowohl auf diese Weise als auch beim Erstellen des Bundles in BundleConfig.cs versucht, aber wenn ich in meiner Ansicht @ Styles.Render ("~ / CssBundle") hinzufüge, erhalte ich nur <link href = "/ CssBundle" rel = "stylesheet "/> das gibt mir 404. Irgendeine Idee warum?
vsdev
@vsdev Ich weiß, dass dies 4 Jahre zu spät ist, aber Sie müssen möglicherweise Ihre BundleConfig.cs überprüfen, um sicherzugehen, dass Sie sie korrekt hinzufügen. Die Zeile in dieser Antwort verweist nur auf ".js"Dateien. Im Inneren public static void RegisterBundles(BundleCollection bundles) { ... }sollten Sie in der Lage sein, so etwas zu tun, bundles.Add(new StyleBundle("~/CssBundle"));und es würde alle CSS-Dateien in Ihrem CssBundleOrdner abrufen. Sie möchten nicht ScriptBundlewie im Beispiel für CSS-Dateien.
Vapcguy
17

Aktualisieren Sie das Paket von Nuget (installieren Sie es neu). Verwenden Sie dazu den folgenden Befehl:

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

M. Salah
quelle
14

In meinem Fall handelte es sich um ein tfs-Problem, da tfs Binärdateien ausschließt, sodass die Nugget-PM das installierte Nugget findet und die Bibliothek nicht aktualisiert. Wenn Sie ein ähnliches Problem haben:

  • Gehen Sie zur Quellcodeverwaltung
  • Navigieren Sie zu .. \ packages \ Microsoft.Web.Optimization
  • Ordner lib hinzufügen (deaktivieren Sie die Option zum Ausschließen von binären Erweiterungen)
  • Aktualisieren Sie Ihre Lösung und fügen Sie die DLL-Referenz aus dem Pfad hinzu

Hinweis: Der Paketordner befindet sich auf derselben Ebene wie die Datei yousolution.sln

Amin
quelle
11

Verwenden von nuget zum Deinstallieren von System.Web.Optimization in der Paketmanagerkonsole wie folgt:

Deinstallationspaket Microsoft.AspNet.Web.Optimization

Dann neu installieren mit:

Installationspaket Microsoft.AspNet.Web.Optimization

Kann dieses Problem für Sie lösen.

Myzifer
quelle
1
Nicht sicher, wie dies die Frage beantwortet?
TylerD87
@ TylerD87 Einfach, es löst eine bestimmte Reihe von Umständen und ich bin nicht der einzige, der dies der Fall fand. Wenn Sie die Kommentare zu der Frage lesen, werden Sie feststellen, dass Snekse am 29. April 14 um 16:39 sagte, dass Sie mussten den besonderen Anweisungen folgen, die ich gegeben hatte, und dass unten jemand anderes viel später viel mehr postete und positiv bewertet wurde.
Myzifer
Vielleicht bearbeiten Sie Ihre Antwort so, dass sie eher wie eine Antwort aussieht? Ich wusste nicht einmal, dass Sie die Frage beantworteten oder was Sie vorschlugen.
TylerD87
@ TylerD87 Die Frage betraf die Optimierung und meine Antwort betraf die Optimierung. Sie löst das in der Frage beschriebene Problem und wurde von mindestens 2 anderen bestätigt, wenn Sie genau angeben würden, wie Sie meine Antwort falsch verstanden haben und wie am besten Ich könnte es ändern / ergänzen, um einem breiteren Publikum eine klarere Antwort zu geben, als ich gerne solche Änderungen vornehmen würde, aber ohne konstruktive Kritik kann ich nicht feststellen, wie ich mich verbessern könnte.
Myzifer
Hallo, ich habe eine Bearbeitung vorgeschlagen, die klarer macht, worauf ich mich beziehe. Nachdem ich die Kommentare oben gelesen habe, sehe ich, dass dies tatsächlich der Vorschlag ist, der funktioniert hat, aber die Art und Weise, wie Ihre Antwort präsentiert wurde, war unklar, was Sie tatsächlich vorgeschlagen haben.
TylerD87
6

Installieren Sie es von NUGet über Visual Studio. Öffnen Sie Visual Studio 2010 und wählen Sie Extras-> Bibliothekspaket-Manager-> Paketmanager-Konsole

Dies öffnet den Conslve, Paste

Install-Package Microsoft.AspNet.Web.Optimization 

und eintreten. und du bist fertig

Mian
quelle
2

in Global.asax application_start festgelegt (im RELEASE-Modus usw.):

BundleTable.EnableOptimizations = **true**;

Aktivieren der Minimierung und Ändern in false im DEBUG-Modus , um alle Skript- und Stildateien einzeln zu rendern.

Zenichi
quelle
5
Es ist einfacher, dies über die web.config zu steuern. Wenn <compilation debug="true" />gesetzt ist (was beim Erstellen einer Debug-Version ziemlich Standard ist), findet keine Optimierung statt. Normalerweise wird diese Einstellung in einem Release-Build automatisch entfernt. BundleTable.EnableOptimizationssollte nur verwendet werden, um die web.config zu überschreiben. Für weitere Informationen: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (Suche nach "Controlling Bundling and Minification")
mhu
Das hat mir sehr geholfen, danke. Ich musste es deaktivieren, weil die Arbeit mit dotless + RequestReduce die Bündel durcheinander brachte.
siva.k
Diese Einstellung hängt wirklich davon ab, ob Sie vorminimierte Dateien in Ihren Bundles verwenden oder ob Sie nicht minimierte Dateien verwenden - nicht so sehr, wenn Sie sich in Debug oder Release befinden, mit Ausnahme der Best Practices für jeden dieser Modi - z. Sie können ein Projekt haben, das Sie im Debug-Modus kompilieren, aber wo Sie es haben, BundleTable.EnableOptimizations = false;weil Sie in Ihrer BundleConfig.cs alle vorminimierten Dateien angeben und nicht möchten, dass sie erneut minimiert werden.
Vapcguy
Dies wäre wirklich nur die Antwort auf das Problem einer Person, wenn sie nicht vorminimierte Dateien (dh Dateien OHNE .min) in ihrer BundleConfig.cs verwenden würde. Wenn sie .min-Dateien verwenden und auf true setzen würden, hätte dies Probleme.
Vapcguy