MVC 4 @Scripts „nie istnieje”


201

Właśnie utworzyłem projekt ASP.NET MVC 4 i użyłem programu Visual Studio 2012 RC do utworzenia widoków kontrolera i żyletki Indexoraz Createakcji.

Gdy przyszedłem uruchomić aplikację i przejrzałem Createwidok, pokazany został następujący błąd:

Komunikat o błędzie kompilatora: CS0103: Nazwa „Skrypty” nie istnieje w bieżącym kontekście

Problemem jest następujący kod, który został dodany automatycznie na dole Widoku:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Dlaczego skrypty nie istnieją?

Spojrzałem na podstawową klasę strony internetowej w asemblerze System.Web.Mvc.dll, v4.0.0.0

Widzę następujące właściwości pomocnika:

  • Ajax
  • HTML
  • URL

Ale nic nie nazywa Skryptów.

Jakieś pomysły?

EDYTOWAĆ:

Mój plik Web.config wygląda następująco (nietknięty od tego, który utworzył Visual Studio):

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

EDYCJA 2:

Ludzie blogują na temat korzystania z @Scriptspomocnika:

Jednak po zainstalowaniu programu Visual Studio 2012 RC na nowej instalacji systemu Windows 8 nadal nie mogę go używać, @Scriptsmimo że program Visual Studio dodaje go do wygenerowanego widoku!

Rozwiązania są przedstawione poniżej.

Nie jestem pewien, jak to zamknąć, ponieważ ostatecznie wydawało się, że aktualizacja rozwiązała problem. Dokładnie sprawdziłem, czy wykonałem czystą instalację, używając nowego projektu. Ale ten sam nieudany projekt, który sprawiłem, że działa dobrze po różnych aktualizacjach i bez ręcznej oczywistej interwencji. Dzięki za wszystkie przemyślenia, ale wtedy zdecydowanie był problem;)


próbujesz już dodać w Web.config? <system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> etc... </pages>
Zach dev

Dodałem sekcję z Web.config, ale nic nie zmieniłem w tym pliku.
FantasticJamieBurns

6
Masz na myśli plik „My Views \ Web.config”, a nie katalog główny aplikacji web.config. W każdym razie jest niepoprawna i brakuje jej <add namespace = "System.Web.Optimization" />. Czy zainstalowałeś VS12 Beta przed RC? Jaka wersja Win8?
RickAndMSFT

@RickAndMSFT Zrobiłem czystą instalację Win8 z ISO Release Preview, wraz z instalacją z VS 2012 RC ISO, aby absolutnie upewnić się, że nie jest to konflikt wersji.
FantasticJamieBurns

@RickAndMSFT Moje widoki \ Web.config nie zobaczyłoby żadnych widoków w obszarach
Maslow

Odpowiedzi:


269

Kluczem tutaj jest dodanie

 <add namespace="System.Web.Optimization" /> 

ZARÓWNO do plików web.config. Mój scenariusz był taki, że miałem odwołanie do System.Web.Optimization zarówno w projekcie, jak i głównym pliku web.config / root, ale @Scripts nadal nie działały poprawnie. Musisz dodać odwołanie do przestrzeni nazw do pliku widoków web.config, aby działał.

AKTUALIZACJA:

Od czasu wydania MVC 4 System.Web.Optimization jest już przestarzały. Jeśli zaczynasz od pustego rozwiązania, musisz zainstalować następujący pakiet nuget:

Install-Package Microsoft.AspNet.Web.Optimization

Nadal będziesz musiał odwoływać się do System.Web.Optimization w swoich plikach web.config. Aby uzyskać więcej informacji, zobacz ten temat:

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

Jak wielu zauważyło, ponowne uruchomienie VS może być wymagane po wykonaniu powyższych kroków, aby to zadziałało.


8
Może być również konieczne uruchomienie Install-Package Microsoft.AspNet.Web.Optimizationz pustego szablonu ASP.NET MVC4, ponieważ nie jest on domyślnie dołączony.
Portman

@Portman Tak, jeśli rzeczywiście zacząłeś od pustego szablonu projektu MVC, musisz zainstalować pakiet Microsoft.AspNet.Web.Optimization.
Marko,

2
Należy go tylko dodać w pliku web.config w folderze Views.
user1534664,

9
To jest rzeczywiście rozwiązanie. Musiałem jednak ponownie uruchomić studio wizualne, aby zostało to rozpoznane.
Jason Eades

4
Musiałem dodać to do mojego pliku Views / Web.config, a następnie ponownie uruchomić program Visual Studio.
Caverman,

48

@Stylesi @Scriptssą 2 nowymi pomocnikami dostarczonymi przez System.Web.Optimizationbibliotekę. Jak sama nazwa wskazuje, łączą i minimalizują odpowiednio pliki lub zasoby CSS i JavaScript.

Spróbuj dołączyć przestrzeń nazw System.Web.Optimizationalbo przez @usingdyrektywę, albo przezweb.config

http://ofps.oreilly.com/titles/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

AKTUALIZACJA

Microsoft przeniósł pakiet / minimalizację do osobnego pakietu o nazwie Microsoft.AspNet.Web.Optimization. Możesz pobrać zestaw z nuget .

Ten post będzie ci przydatny.


2
Dodanie System.Web.Optimization mówi „CS0234: Typ lub nazwa przestrzeni nazw„ Optymalizacja ”nie istnieje w przestrzeni nazw„ System.Web ”. Nie ma odwołania o nazwie System.Web.Optimization, aby dodać.
FantasticJamieBurns

1
Przestrzeń nazw System.Web.Optimization stała się przestarzała, ponieważ udzielono odpowiedzi, spróbuj zamiast tego użyć Microsoft.AspNet.Web.Optimization. Zobacz to pytanie, aby uzyskać więcej informacji: stackoverflow.com/questions/9475893/...
Jeremy Jarrell,

3
Wyjaśnienie: Przestrzeń System.Web.Optimizationnazw NIE jest przestarzała, tak System.Web.Optimization.dlljest.
Despertar

Dzięki! Działa mi, gdy mam problem z układem innej OBSZARU.
Deweloper

48

Z góry brakowało jednego małego kroku, który znalazłem w innym poście. Po dodaniu

<add namespace="System.Web.Optimization" />

do swoich ~/Views/web.configprzestrzeni nazw, zamknij i ponownie otwórz Visual Studio. Właśnie to musiałem zrobić, aby to zadziałało.


2
To samo tutaj, restart VS działał, ale wcześniej pokazywał błąd ...?
Andreas

Zamykanie VS nie było w moim przypadku konieczne, ale musiałem zamknąć i ponownie otworzyć widok .cshtml, którego
używałem

29

Korzystam z obszarów i właśnie natknąłem się na ten problem, właśnie skopiowałem przestrzenie nazw z głównego pliku web.config do sieci obszarów. config i teraz działa !!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />

15

Miałem ten sam problem i użyłem WinMerge, aby pomóc mi to wyśledzić. Ale gdy go więcej zbadałem, okazało się, że Rick ma do tego idealny post na blogu .

Podsumowanie:

  • Dodaj <add namespace="System.Web.Optimization"/>do obu plików web.config
  • Biegać Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • Zaktualizuj kod pakietu
  • Zaktualizuj plik układu
  • Ostatnim krokiem jest aktualizacja 10 innych bibliotek. Nie zrobiłem tego i działało dobrze. Wygląda na to, że możesz odwlekać ten (chyba że zaktualizowałem już 1 lub więcej z nich). :)

Dzięki za odpowiedź dla Dana! (I wskazując na mojego bloga). Jego pytanie sugerowało, że zaczął od RC, ale myślę, że masz rację. Właśnie dodał kontroler z RC do projektu Beta.
RickAndMSFT

Minęło kilka tygodni i oboje na pewno zgaduję. Z pewnością umieściłem VS 2012 na moim tablecie, który nigdy nie miał nic oprócz Metro Apps i nie udało mi się. Spróbuję ponownie na maszynie wirtualnej.
FantasticJamieBurns

To zadziałało dla mnie. Przeczytaj link do artykułu, aby uzyskać dokładne instrukcje na temat tego, co musisz zrobić.
Justin

11

Miałem ten sam problem:

Używana wersja System.Web.Optimization była przestarzała dla MVC4 RC.

Zaktualizowałem moje pakiety za pomocą menedżera pakietów w VS 2010.

W tym blogu MSDN pan Andy opowiada o tym, jak zaktualizować swój projekt MVC 4 Beta do MVC 4 RC. Aktualizacja moich pakietów spowodowała, że ​​skrypty (szczególnie te do optymalizacji sieci) zostały dla mnie rozwiązane:

Aby zainstalować najnowszy pakiet System.Web.Optimization, użyj konsoli Menedżera pakietów (Narzędzia -> Menedżer pakietów biblioteki -> Konsola Menedżera pakietów) i uruchom następujące polecenie:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

Użyj pliku System.Web.Optimization zawartego w pakiecie w swoich referencjach.

Aby zaktualizować inne pakiety: Menu Narzędzia -> Menedżer pakietów bibliotek -> Zarządzaj pakietami NuGet dla rozwiązania.


5

Utwórz nową aplikację internetową MVC 4 RC i uruchom ją. Przejdź do Login, który używa tego samego kodu

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

To, co umożliwia działanie Login.cshtml, to plik Views \ Web.config (nie wersja root aplikacji)

<namespaces>

    <add namespace="System.Web.Optimization"/>

  </namespaces>

Dlaczego Twój widok Utwórz nie działa, a Logowanie jest?


Nie korzystałem z Login - mogło to być w tym czasie zepsute.
FantasticJamieBurns

5

Zaimportuj System.Web.Optimization na swój widok maszynki w następujący sposób:

@using System.Web.Optimization

3

Natknąłem się jednak na ten problem podczas uruchamiania polecenia:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

Otrzymałem tajemniczą wiadomość (uwielbiam świetną kalambur przed pierwszą filiżanką kawy):

Pakiet instalacyjny: określony algorytm kryptograficzny nie jest obsługiwany na tej platformie.

Używam tego w systemie Windows XP SP3 (nie z wyboru) i znalazłem, że musiałem postępować zgodnie z instrukcjami opublikowanymi przez użytkownika artsnob na forum ASP.NET

  • Odinstaluj Nuget i spróbuj ponownie zainstalować. Jeśli nie możesz tego zrobić, zaloguj się jako Administrator.
  • Przejdź do Narzędzia => Menedżer rozszerzeń => Wybierz „Menedżer pakietów Nuget” => Odinstaluj
  • Zainstaluj go ponownie, wyszukując „Nuget” => Zainstaluj.
  • Jeśli to nie zadziałało, spróbuj zainstalować wersję 1.7.x, jak wspomniałem w poprzednim poście (nie oznacza to, że musisz użyć poprzedniej wersji, jeśli działa poprawnie, możemy zgłosić ten błąd i uzyskać łatki do najnowszej wersji).

Po uruchomieniu tego mógłbym uruchomić wiersz poleceń, aby zaktualizować Web.Optimization.

Mam nadzieję, że to uratuje komuś kopanie.


2

Tylko napisz

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}

@archil Dzięki za wymianę - będzie to dobre rozwiązanie tymczasowe. Ale główne pytanie brzmiało: „Dlaczego skrypty nie istnieją?”
FantasticJamieBurns

@Jamie powinna istnieć? O ile pamiętam, nie ma tam pomocnika Sciptów. Może próbujesz użyć zewnętrznego pomocnika?
archil

1
Sam nie dodałem tego kodu - program Visual Studio 2012 RC dodał go podczas tworzenia widoku dla mojej akcji tworzenia. Myślę, że jakoś mój MVC 4 nie jest właściwy. Musi gdzieś zadziałać, ponieważ Scott Hanselman wspomina o nieudanej składni jako nowym dodatku do MVC 4 RC: hanselman.com/blog/…
FantasticJamieBurns

1

Uaktualniłem z wersji beta do wersji RC i napotkałem problem „Skrypty” nie istnieją. Przeglądano całą sieć, a ostateczne rozwiązanie jest takie, jak powiedział N40JPJ, oraz kolejne obejście:

Skopiuj następujące w View \ Web.config:

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Helpers"/>
  </namespaces>

oraz następujące w View \ Shared_Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

Mam nadzieję, że to pomoże.


1
Nie ma potrzeby korzystania, if (IsSectionDefined())chyba że podasz elseklauzulę. Fakt, że mówisz required: falsejuż, pozwala nie zdefiniować tej sekcji, w takim przypadku sekcja zostanie pominięta. Jest to więc niepotrzebny dodatkowy kod.
ErikE

0

Najwyraźniej utworzyłeś typ projektu „Pusty” bez folderu „Skrypty”. Moja rada - stwórz projekt typu „Podstawowy” z pełnym folderem „Skrypty”.

W odniesieniu do wszystkich programistów.


0

po prostu usuń / ukryj kod z widoku Utwórz i edytuj brzytwę swojego kontrolera.

 @section Scripts {  

   @Scripts.Render("~/bundles/jqueryval")  
 }  

0
  1. : usuń stronę przeglądania.
  2. : dodaj przestrzeń nazw webconfig (w katalogu widok)
  3. : utwórz zobacz próbę!

powodzenia...


0

Jeszcze jedno dla puli - spędzone wieki próbujące rozwiązać ten sam problem - nawet jeśli zostało to zdefiniowane w pliku web.config dla roota i roota Views. Okazuje się, że omyłkowo dodałem go do elementu <system.web><pages><namespaces>, a nie do <system.web**.webPages.razor**><pages><namespaces>elementu.

Naprawdę łatwo tego przegapić!


0

Kiedy wchodzę na stronę z tym kodem:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Wystąpił ten błąd: błąd. Podczas przetwarzania żądania wystąpił błąd.

A ten wyjątek jest rejestrowany w moich logach:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

Wypróbowałem wszystkie wskazówki na tej stronie i żadna z nich nie została dla mnie rozwiązana. Więc spojrzałem na mój folder Packages i zauważyłem, że mam dwie wersje System.Web.Optmization.dll:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0 - 68,7KB)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0 - 304KB)

Mój projekt odwoływał się do starszej wersji beta. Zmieniłem tylko odniesienie do nowszej wersji (69 KB) i wszystko działało dobrze.

Myślę, że to może komuś pomóc.


0

To oczywiste rozwiązanie. Miałem ten sam problem później. Niepowiązane z odwołaniami do zespołu lub ... Będzie to miało miejsce w wywołaniu hierarchii widoków częściowych MVC, gdy masz skomplikowane struktury stron. Wywołanie / renderowanie każdej części osobno na każdej stronie (być może stronie wzorcowej lub częściowej) spowoduje, że nie zobaczą wymaganych części strony, takich jak poniższy kod:

@RenderSection("Scripts", required: false)

To po prostu zmusza stronę do znalezienia i renderowania powiązanej sekcji, a w przypadku awarii wyświetla komunikat o błędzie, taki jak ty.

Sugeruję więc prześledzenie stron (np. Śledzenia programu) od głównego do wszystkich jego części, aby wykryć zależności . Może to okropna praca, ale nie ma tu innych możliwości.

Nie to, że z mojego doświadczenia wynika, że ​​niektóre sytuacje warunkowe w programowaniu powodują, że problem nie pokazuje prawidłowego błędu.


0

Miałem ten problem po dodaniu obszaru do projektu, który go nie miał. Aby się go pozbyć, po prostu skopiowałem plik web.config z głównym folderem Widoki do folderu Widoki obszaru i zaczął działać.


0

Rozwiązuję ten problem w MvcMusicStore, dodając tę ​​część kodu do _Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

i usuń ten kod z Edit.cshtml

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Uruchom program inshallah będzie z tobą współpracować.


0

Dla mnie to rozwiązało problem, w konsoli menedżera pakietów NuGet napisz:

update-package microsoft.aspnet.mvc -reinstall

0

Kiedy ostatnio zacząłem używać MVC4, napotkałem powyższy problem podczas tworzenia projektu z pustymi szablonami. Kroki prowadzące do rozwiązania problemu.

  1. Idź do TOOLS-> Library Package Manager-> Packager Manager Console Wklej poniższe polecenie i naciśnij enter Install-Package Microsoft.AspNet.Web.Optimization Uwaga: poczekaj na pomyślną instalację.
  2. Przejdź do pliku Web.Config na poziomie głównym i dodaj poniżej przestrzeń nazw w sekcji przestrzeni nazw stron. Dodaj<namespace="System.Web.Optimization" />
  3. Przejdź do Web.Config w folderze Views i wykonaj krok 2.
  4. Zbuduj rozwiązanie i uruchom.

Pakiet wymieniony w kroku 1 doda kilka bibliotek systemowych do odniesień do rozwiązania, takich jak System.Web.Optimization nie jest domyślnym odniesieniem dla pustych szablonów w MVC4.

Mam nadzieję, że to pomoże. Dziękuję Ci


0

Miałem bardzo podobny błąd podczas uaktualniania projektu z MVC3 do MVC4.

Komunikat o błędzie kompilatora: CS0103: Nazwa [blah] nie istnieje w bieżącym kontekście

W moim przypadku miałem nieaktualne numery wersji w kilku moich Web.Configs.

  1. Musiałem zaktualizować numer wersji System.Web.Mvc z „3.0.0.0” na „4.0.0.0” w każdym Web.Config w moim projekcie.
  2. Musiałem zaktualizować wszystkie numery wersji System.Web.WebPages, System.Web.Helpers i System.Web.Razor z „1.0.0.0” na „2.0.0.0” w każdym Web.Config w moim projekcie.

Dawny:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

Pamiętaj, aby przejrzeć Web.Configs w każdym z katalogów Views.

Możesz przeczytać więcej na temat aktualizacji projektu ASP.NET MVC 3 do ASP.NET MVC 4 .


0

Jeśli dodałeś do pliku web.config i nadal wyświetla komunikat, musisz zamknąć projekt i otworzyć go ponownie, teraz będzie istniał i @ Styles.Render („”) i @ Scripts.Render () będą działały dobrze.


-1

Spróbuj tego:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
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.