Jak dodać odniesienie do System.Web.Optimization dla aplikacji MVC-3-przekonwertowanej na 4


458

Próbuję użyć nowej funkcji sprzedaży pakietowej w projekcie, który niedawno przekonwertowałem z MVC 3 na MVC 4 w wersji beta. Wymaga linii kodu w global.asax BundleTable.Bundles.RegisterTemplateBundles();, która wymaga using System.Web.Optimization;na górze.

Kiedy to robię, otrzymuję czerwone, zawijasowe linie, które mówią: „Czy brakuje odniesienia do zestawu?” Kiedy próbuję dodać odniesienie i klikam kartę .NET w oknie dialogowym, sortuję od AZ, nie widzę System.Web.Optimization.

Jak dodać to odniesienie do mojego projektu?


6
Miałem już Optymalizację, ale powodowało to problem z ScriptBundle, który mogłem rozwiązać tylko po odinstalowaniu Opti ... a następnie ponownej instalacji.
Myzifer

1
@Myzifer Powinieneś przesłać swój komentarz jako odpowiedź. To była jedyna rzecz, która działała dla mnie, aby przywrócić System.Web.Optimizationwęzeł do moich referencji.
Snekse

2
@myzifer Twoja odpowiedź jest poprawna dla tego dziwnego zachowania. Tylko rzeczą, która rozwiąże ten problem dla mnie jest uruchomiony wiersz cmd Nuget: UnInstall-Package Microsoft.AspNet.Web.Optimization a następnie zaraz po uruchomieniu instalacji: Instalacja-Package Microsoft.AspNet.Web.Optimization. Próbowałem sprawić, by działał przez wiele tygodni na moim komputerze domowym z VStudio 2013 i nigdy nie mogłem go zdobyć. Dziękuję bardzo.
raddevus,

@Myzifer - również dla mnie działał - „Sprawdziłem” projekt z VSOnline i miał ten błąd - odinstaluj, a następnie zainstaluj ponownie - 20 sekundowe zadanie - dzięki - to jeden z tych głupich problemów, na które możesz łatwo stracić dzień!
Percy

Odpowiedzi:


728


Dostępna jest aktualizacja 1.1.x, przeczytaj informacje o wersji: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Pakiet Microsoft.Web.Optimization jest już nieaktualny. W programie ASP.NET (MVC) 4 i nowszych należy zainstalować program Microsoft ASP.NET Web Optimization Framework:

  • Zainstaluj pakiet z nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Utwórz i skonfiguruj pakiety w 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")
            );
        }
    }
  • Wywołaj funkcję RegisterBundles () z Application_Start () w pliku global.asax.cs:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • W pliku view.cshtml uwzględnij przestrzeń nazw optymalizacji i wyrenderuj pakiety:

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

Więcej informacji można znaleźć na stronie http://www.asp.net/mvc/overview/performance/bundling-and-minification


2
Czy potrzebujesz MVC4, aby tego użyć?
FloatLeft

5
To nie jest przestarzałe. Tak go używam w końcowych wersjach Visual Studio 2012 i ASP.NET (MVC) 4.
mhu

29
Twoja odpowiedź obejmuje „korzystanie z System.Web.Optimization;”, o to właśnie pyta pytający.
davidpricedev

9
@dave: Czy to dobrze czy źle? Aby rozwiązać problem „brakującego odniesienia do zestawu”, należy zainstalować Microsoft.AspNet.Web.Optimization, jak wspomniano w odpowiedzi.
mhu,

6
w domyślnym szablonie MVC mogłem użyć klasy Scripts bez dodawania przestrzeni nazw System.Web.Optimization na górze strony. Ale w mojej przyszłości pojawia się błąd „nazwa Skrypty nie istnieje”. Jak mogę to rozwiązać? Dodanie tej przestrzeni nazw w web.config nie pomogło. Edycja: rozwiązanie przeładowania pomogło, przepraszam :)
Wachburn,

83

W ostatecznej wersji ASP.Net MVC 4 podejście wygląda następująco:

  • Zainstaluj Microsoft.AspNet.Web.Optimization przez nuget (ponieważ nie jest instalowany przez framework)

    install-package Microsoft.AspNet.Web.Optimization
  • Utwórz pakiet w Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Dodaj przestrzeń nazw „System.Web.Optimization” do pliku web.config „Widoki”:

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • W view.cshtml dodaj dołączenie do pakietu utworzonego w ostatnim kroku:

    @Scripts.Render("~/MyBundle")

W trybie debugowania wszystkie pliki skryptów w katalogu będą renderowane osobno; w trybie zwolnienia zostaną one powiązane i zminimalizowane.


Prawidłowo, ta wersja zawiera. Druga wersja nie.
Luke Belbina

1
Nie rozumiem, dlaczego to dla mnie nie działa. Próbowałem zarówno w ten sposób, jak i do utworzenia pakietu w pliku BundleConfig.cs, ale kiedy dodam @ Styles.Render („~ / CssBundle”), moim zdaniem, otrzymuję <link href = "/ CssBundle" rel = "arkusz stylów "/> to daje mi 404. Wiesz, dlaczego?
vsdev

@vsdev Wiem, że to 4 lata za późno, ale być może będziesz musiał sprawdzić plik BundleConfig.cs, aby upewnić się, że dodajesz go poprawnie - wiersz w tej odpowiedzi dotyczy tylko ".js"plików. Wewnątrz public static void RegisterBundles(BundleCollection bundles) { ... }powinieneś być w stanie zrobić coś takiego, bundles.Add(new StyleBundle("~/CssBundle"));a to przechwyciłoby wszystkie pliki CSS w twoim CssBundlefolderze. Nie chcesz ScriptBundletak jak w przykładzie dla plików CSS.
vapcguy

17

Zaktualizuj (ponownie zainstaluj) pakiet z nuget, możesz użyć polecenia:

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


14

W moim przypadku był to problem z tfs, ponieważ tfs wykluczają pliki binarne, więc Nugget PM znajduje samorodek zainstalowany i nie aktualizuje biblioteki Jeśli masz podobny problem:

  • Przejdź do kontroli źródła
  • Przejdź do .. \ packages \ Microsoft.Web.Optimization
  • Dodaj folder lib (odznacz wykluczające rozszerzenia binarne)
  • Zaktualizuj swoje rozwiązanie i dodaj odwołanie dll ze ścieżki

Uwaga: folder pakietu znajduje się na tym samym poziomie pliku yousolution.sln


11

Używanie programu nuget do odinstalowywania System.Web.Optimization w konsoli menedżera pakietów w następujący sposób:

Odinstaluj pakiet Microsoft.AspNet.Web.Optimization

Następnie ponowna instalacja za pomocą:

Zainstaluj pakiet Microsoft.AspNet.Web.Optimization

Może rozwiązać ten problem.


1
Nie wiesz, jak to odpowie na pytanie?
TylerD87,

@ TylerD87 Proste rozwiązuje konkretny zestaw okoliczności i nie jestem jedynym, który stwierdził, że tak jest, jeśli przeczytasz komentarze do pytania, które zauważysz Snekse powiedział 29 kwietnia 14 o 16:39, że musieli postępować zgodnie ze szczegółowymi instrukcjami, które podałem i że poniżej ktoś inny napisał to samo znacznie później i został pozytywnie oceniony.
Myzifer

Może edytuj swoją odpowiedź, aby wyglądała bardziej jak odpowiedź? Nawet nie zdawałem sobie sprawy, że odpowiadasz na pytanie lub co sugerujesz.
TylerD87,

@ TylerD87 Pytanie dotyczyło optymalizacji, a moja odpowiedź dotyczyła optymalizacji, rozwiązuje problem opisany w pytaniu i została potwierdzona przez co najmniej 2 inne osoby, jeśli podasz szczegóły, w jaki sposób źle zrozumiałeś moją odpowiedź i jak najlepiej Mógłbym to zmienić / poprawić, aby zapewnić szerszej publiczności jaśniejszą odpowiedź, wtedy chętnie wprowadzę takie zmiany, ale bez konstruktywnej krytyki nie jestem w stanie określić, jak mogę poprawić.
Myzifer

Cześć, zasugerowałem edycję, która wyjaśnia, o czym mówiłem. Po przeczytaniu komentarzy u góry widzę, że tak naprawdę jest to sugestia, która zadziałała, ale sposób, w jaki została przedstawiona twoja odpowiedź, nie był jasny, co właściwie sugerujesz.
TylerD87,

6

Zainstaluj go z NUGet przez Visual Studio Open Visual Studio 2010, wybierz Narzędzia-> Biblioteka Menedżer pakietów-> Konsola Menedżera pakietów

Otworzy to konsolę, wklej

Install-Package Microsoft.AspNet.Web.Optimization 

i wejdź. i gotowe


2

ustawiony w Global.asax application_start (w trybie RELEASE itp.):

BundleTable.EnableOptimizations = **true**;

aby włączyć minimalizację i zmienić na false w trybie DEBUG, aby renderować wszystkie pliki skryptów i stylów osobno.


5
Łatwiej jest to kontrolować za pomocą web.config. Jeśli <compilation debug="true" />jest ustawiony (co jest dość standardem podczas budowania wersji debugowania), optymalizacja nie jest przeprowadzana. Zwykle to ustawienie jest automatycznie usuwane w kompilacji wydania. BundleTable.EnableOptimizationspowinien być używany tylko do unieważnienia pliku web.config. Aby uzyskać więcej informacji: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (wyszukaj „Controlling Bundling and Minification”)
mhu

Bardzo mi to pomogło, dziękuję. Musiałem go wyłączyć, ponieważ praca z bez kropkami + RequestReduce powodowała, że ​​pakiety były zniekształcone.
siva.k

To ustawienie naprawdę zależy od tego, czy używasz wstępnie zminimalizowanych plików w swoich pakietach, czy używasz niezminimowanych plików - nie tyle, jeśli korzystasz z debugowania lub wydania, z wyjątkiem najlepszych praktyk dla każdego z tych trybów - np. , możesz mieć projekt, który kompilujesz w trybie debugowania, ale jeśli tak, BundleTable.EnableOptimizations = false;ponieważ w pliku BundleConfig.cs określasz wszystkie wstępnie zminimalizowane pliki i nie chcesz, aby dokonywał na nich kolejnej minimalizacji.
vapcguy

To naprawdę byłaby odpowiedź na czyjś problem, gdyby korzystali z plików niezminimalizowanych (tj. Plików BEZ .min) w pliku BundleConfig.cs. Gdyby użyli plików .min i ustawili wartość true, mieliby problemy.
vapcguy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.