Nazwa „model” nie istnieje w obecnym kontekście w MVC3

119

Dodałem stronę cshtml w projekcie. Kiedy próbuję dodać do niego następującą deklarację, pojawia się błąd: „Nazwa 'model' nie istnieje w obecnym kontekście”.

@model xyz.abc.SomeClass

Sprawdziłem referencje, wszystkie są na miejscu. Dodałem plik web.config w folderze widoku, ale to nie rozwiązało problemu.

Czy jest coś, czego mi brakuje?

user602737
źródło
Jeśli szukasz rozwiązania MVC4, odpowiedź od Adama jest prawidłowa, musisz znaleźć poprawny numer wersji z głównego pliku web.config i użyć go tutaj. W folderze widoków MVC4 web.config brakowało wiersza <host> i skopiowano go z głównego pliku web.config (może mieć inne wartości, więc sprawdź swoje) i umieściłem go w widokach. Następnie zamknęliśmy projekt i załadowaliśmy go ponownie w Visual Studio i udało się.
Farrukh Subhani,

Odpowiedzi:

238

Aktualizacja: Jeśli używasz nowszej wersji MVC, obowiązuje ten sam proces, po prostu upewnij się, że używasz prawidłowego numeru wersji w <host>wierszu web.config .

Cóż, doświadczyłem tego samego, co ty, i po dalszych badaniach dowiedziałem się, na czym polega problem!

Musisz dołączyć domyślny plik web.config MVC3 dla folderu Views. MVC3 ma dwa: jeden w katalogu głównym aplikacji i jeden w folderze widoków. Zawiera sekcję zawierającą przestrzenie nazw. Upewnij się, że twój wygląda mniej więcej tak:

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.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>

Sugeruję utworzenie nowego projektu MVC3, a następnie skopiowanie utworzonego dla Ciebie pliku web.config do folderu widoków.

Ważne Gdy to zrobisz, musisz zamknąć plik i ponownie go otworzyć. Voila! Intellisense!

Adam Terlson
źródło
1
Nie mogę zaznaczyć tego jako odpowiedzi, ale to też był mój problem. Zapomniałem dodać te sekcje do pliku web.config.
Dave,
Tak, chciałbym móc oznaczyć Twoją jako odpowiedź. Utknąłem na tym przez jakiś czas (zrezygnowałem po mojej pierwszej próbie konwersji na Razor nie powiodło się) i to był problem przez cały czas. Dzięki!
Brian Donahue,
3
Nie działa na mnie. Lub przynajmniej czasami dostaję inteligencję, a czasami nie, mimo że mam to wszystko ustawione w web.config w folderze Views.
Tom Lianza
Dziękuję Ci bardzo! To ochroniło mój dzień!
Siergiej
9
upewnij się, że zaktualizowałeś do najnowszej wersji (dla MVC 5 tutaj) w MAINpliku web.config<add key="webpages:Version" value="3.0.0.0" />
Simon_Weaver
30

Napotkałem ten sam problem, kiedy tworzyłem nowy obszar do organizowania moich stron. Moja konstrukcja wyglądała następująco:

WebProject

- [] Areas
    - [] NewArea
        - [] Controllers
        - [] Views
- [] Controllers
- [] Views
    - Web.config
- Web.config

Widoki utworzone w folderze Widoki w WebProject działały poprawnie, ale widoki utworzone w obszarze NewArea powodowały następujący błąd:

Nazwa „model” nie istnieje w obecnym kontekście.

Aby to naprawić, skopiowałem plik web.config z folderu Views pod WebProject do folderu Views w NewArea. Zobacz poniżej.

WebProject

- [] Areas
    - [] NewArea
        - [] Controllers
        - [] Views
            - **Web.config**
- [] Controllers
- [] Views
    - Web.config
- Web.config

Wpadłem na to, ponieważ ręcznie utworzyłem ten nowy obszar za pomocą Dodaj -> Nowy folder, aby dodać foldery. Powinienem kliknąć projekt prawym przyciskiem myszy i wybrać Dodaj -> Obszar. Wtedy Visual Studio zająłby się poprawnym ustawieniem obszaru.

Paul Syfrett
źródło
2
+1 ... Właśnie zauważyłem, że z jakiegoś powodu ten plik web.config nie został dołączony, cieszę się, że znalazłem odpowiedź, aby rozwiązać mój problem
pollirrata
2
Zdaję sobie sprawę, że to stare, ale faktycznie miałem dzisiaj ten sam problem, więc chciałem podziękować za tę odpowiedź. :)
Ricky Mutschlechner
Ja też miałem ten sam problem i podobne rozwiązanie. My Views/Web.configzostała przedstawieniu System.Web.Mvc.MvcWebRazorHostFactorywersji 5.0.0.0, a miałem innej firmy palących odwołań v4.0 i poglądy współpracujących. Ustawić Views/Web.configz powrotem do v4.0 i wszystko działało.
Kody z Hammerem
Twój komentarz dotyczący nadpisania pliku web.config tym z folderu Widoki pomógł mi to naprawić. po prostu uczynienie zawartości dokładnie taką samą nie działa z jakiegoś szalonego powodu. AAARRRGGGHHH! ;)
Ryan Vettese
W moim przypadku używam robocopy do synchronizacji wersji lokalnej z wersją serwerową, z wyłączeniem wszystkich plików web.config. bez pliku web.config w wersji serwerowej pojawi się ten błąd.
Will Wu,
11

Jeśli Twoje widoki znajdują się w zestawie biblioteki klas, co jest przydatne do ponownego wykorzystania wspólnych widoków w projektach, to samo robienie tego, co sugeruje Adam, może nie wystarczyć. Nadal miałem problemy, nawet z tym.

Spróbuj tego w swoim pliku web.config w katalogu głównym projektu:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>
  <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.Helpers" />
        <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.WebPages" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.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" />
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <pages>
      <namespaces>
        <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.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>

A to w pliku web.config w folderze widoków:

<?xml version="1.0"?>

<configuration>
  <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>

  <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>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.web>
    <httpHandlers>
      <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
    </httpHandlers>
    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
</configuration>

To zadziałało dla mnie. Mam teraz funkcję Intellisense i brak błędów kompilacji w moich widokach w projekcie innym niż MVC, do którego mogę następnie odwoływać się z wielu witryn internetowych MVC.

Greg Jackman
źródło
1
Czy dotyczy to plików web.config w projekcie sieci Web, czy plików web.config w bibliotece klas?
Jerm
7

Natknąłem się na ten problem, gdy nieumyślnie miałem kopię pliku widoku (About.cshtml) dla trasy / about w katalogu głównym. (Nie folder widoków) Po przeniesieniu pliku z katalogu głównego problem zniknął.

James Lawruk
źródło
1
Dziękuję Ci! Właśnie zwariowałem z tym samym problemem i to była odpowiedź ;-)
Rob,
Chłodny! Pamiętam też, że oszalałem. :)
James Lawruk
Miałem kilka plików .cshtml w folderze w katalogu głównym, co spowodowało awarię tylko folderu w moich widokach ... while (true) {bashHeadToWall; }. Dzięki.
matt.j.crawford
7

Miałem podobne problemy z VS2012 i VS2013.
Dodanie następującego wiersza do <appSettings> w głównym pliku web.config zadziałało:

<add key="webpages:Version" value="3.0.0.0" />

Jeśli linia już tam była, ale wskazała 2.0.0.0, zmiana na 3.0.0.0 zadziałała.


źródło
To był mój problem po wykonaniu aktualizacji MVC. Mówi się, że 2.0.0.0, po zmianie na 3, działało.
FerX32
6

Aktualizacja: 05.05.2015 W projekcie MVC 5 musisz ustawić wersję na 5.0.0.0 w swoim /views/web.config

<system.web.webPages.razor>
     <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</system.web.webPages.razor>
phanf
źródło
1
Tak znalazłem wersję 5.2.0.0, która powoduje problem, ale zmiana na 5.0.0.0 naprawiła go !!! Dzięki.
vendettamit
5

Podczas deklarowania modelu u góry widoku za pomocą następującego kodu:

@model MyModel

poniżej należy wpisać wielkie litery, na przykład:

@Html.Encode(Model.MyDisplayValue)

Uważam, że brakujący plik web.config w folderze Views byłby główną przyczyną tego problemu, ale jeśli problem zostanie rozwiązany, a problem nadal występuje, sprawdź, czy używasz modelu , a nie modelu, aby odwołać się do niego w źródle.

Bork Blatt
źródło
1
To rozwiązuje błąd, gdy problem polega na tym, że próbujesz odwołać się do swojego modelu we własnym kodzie w widoku, na przykład podczas tworzenia własnego pomocnika, który nie opiera się na wyrażeniach lambda itp.
JohnC
3

Ja też napotkałem ten problem. Moje okoliczności były trochę inne.

  1. Jeden z moich folderów widoku został przypadkowo przeniesiony do katalogu głównego mojego projektu. Prowadzi to do project_root/SignUp/ViewNamewcześniejszego dopasowania trasy project_root/Views/SignUp/ViewName. To spowodowało @modelbłąd.

  2. Po przeniesieniu widoków z powrotem do odpowiedniej lokalizacji katalog został w jakiś sposób odtworzony w katalogu głównym projektu. Tym razem pusty. /SignUp/ViewNamezadziałało, ale /SignUp/wyrzuciło 403 - Forbidden: Access is denied.błąd. Cały folder musi być usunięte z katalogu głównego projektu.

Mam nadzieję, że to komuś pomoże. Spędziłem wiele godzin wierząc, że problem był spowodowany przez naszą ostatnią aktualizację z MVC 3 do MVC 4. Tylko uwaga: problemy z aktualizacją powinny występować tylko między MVC 2 i MVC 3. Jeśli widzisz ten problem w późniejszych wersjach, prawdopodobnie nie jest to spowodowane Aktualizacja.


źródło
2

Zajęło mi to wieki, aby rozwiązać ten problem, ale w końcu mam nadzieję, że rozwiązałem go na MVC, czyli podobnie:

Zainstalowałem ponownie ASP.NET 4.5 ( http://www.asp.net/downloads )

Postępowałem zgodnie z samouczkiem dotyczącym aktualizacji dostępnym pod adresem http://www.asp.net/whitepapers/mvc4-release-notes

ALE ten wspomniany akapit jest dla mnie niewłaściwy

System.Web.Mvc, Version=4.0.0.0
System.Web.WebPages, Version=2.0.0.0
System.Web.Helpers, Version=2.0.0.0
System.Web.WebPages.Razor, Version=2.0.0.0

Ponieważ mam Razor w System.Web.Razor , więc zmieniłem przestrzeń nazw Razor na System.Web.Razor.

Dodaj to do swojego pliku web.config

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
</appSettings>

Dodałem odwołanie do zestawu do wszystkich powyższych zestawów

Znajdź element ProjectTypeGuids i zamień {E53F8FEA-EAE0-44A6-8774-FFD645390401} na {E3E379DF-F4C6-4180-9B81-6769533ABE47}.

To wszystko.

Tomas Kubes
źródło
1
Dodatek appsettings do webconfig rozwiązał to za mnie. Chociaż myślę, że <add key="webpages:Version" value="2.0.0.0" />jest to czynnik napędzający, drugie ustawienie nie jest potrzebne.
But
1
w przypadku MVC 5 tak musi być, 3.0.0.0ale tak, to jest bardzo ważne!
Simon_Weaver
2

To okropny błąd, ale:

Upewnij się, że masz pliki Web.config w widoku na zdalnym . Być może pominąłeś przesyłanie go za pomocą filtrów programu FTP.

Pcodea Xonos
źródło
2

Brakowało mi pliku web.config w obszarze Obszary / MyArea / Views / web.config. Po dodaniu działało dobrze. Tak było w przypadku MVC 5 i .NET4.5

Zwycięzca
źródło
Mojego również brakowało, z pomocą tej strony ponownie go uruchomiłem. forums.asp.net/t/…
Perposterer
0

Jest też inny powód. W moim przypadku skopiowałem plik index.cshtml do głównego folderu sieci (poza folderem Views) jako kopię zapasową ze zdalnego serwera.

Więc ciągle zmieniałem mój /views/web.config, ciągle zmieniałem mój /views/home/index.cshtml i błąd ciągle się pojawiał ... dopóki nie znalazłem /index.cshtml poza folderem widoków, usunąłem go i na pewno wszystko wróciło do normy!

Nestor
źródło
0

Napotkałem ten sam problem, ale w moim przypadku jedyne, co się zmieniło, to odinstalowanie programu Visual Studio 2012 i zainstalowanie programu Visual Studio 2013. Otworzyłem nasze rozwiązanie, ale The name 'model' does not exist in current contextw każdym widoku Razor pojawiał się ten sam błąd.

Mój współpracownik zasugerował sprawdzenie dostępności aktualizacji VS2013. Po zainstalowaniu aktualizacji VS2013 Update 1 przestałem otrzymywać ten błąd.

John Washam
źródło
1
Otrzymuję ten błąd w aktualizacji VS2013 2 . Wraz z aktualizacją 1 działało dobrze. Nie udało mi się jeszcze znaleźć rozwiązania tego problemu. Próbowałem odinstalować aktualizację 2, ale spowodowało to awarię VS po otwarciu pliku cshtml.
iheartcsharp
Mam ten sam problem z aktualizacją 2.
VS2013
0

Sprawdź swój plik konfiguracyjny w katalogu views. w dodaniu klucza do MVC 4/5

sansalk
źródło
0

Ponowna instalacja nugeta rozwiązała to za mnie

PM> Install-Package Microsoft.AspNet.Razor -Version 3.2.3

pixelagent
źródło
0

Dla mnie to był problem. W sekcji brakowało całego bloku.

  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Routing, Version=4.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" />
    <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
Kevin Dark
źródło
0

Mam ten sam problem po aktualizacji pakietów. Zrobiłem wszystko, co napisałeś powyżej w tym temacie, ale czerwona podstawa słowa kluczowego model nie zniknęła. Później znalazłem rozwiązanie: właśnie usunąłem folder `` pakiet '' z katalogu mojego projektu i ponownie skompilowałem, w międzyczasie umożliwiło NuGet przywrócenie brakujących pakietów. Odświeżony i gotowe!

Peter.k
źródło
0

Sprawdź, czy Twój plik web.config powinien istnieć w opublikowanych plikach

Arash Farahani
źródło
0

Miałem ten sam problem, a potem znajdowałem rozwiązanie. Rozwiązaniem jest:

  1. Zamknij program Visual Studio
  2. Usuń plik SUO
  3. Uruchom ponownie program Visual Studio

Plik .suo jest plikiem ukrytym w tym samym folderze, w którym istnieje plik rozwiązania .svn . Mam nadzieję, że zadziała!

Arsman Ahmad
źródło