Nazwa „ViewBag” nie istnieje w obecnym kontekście

89

Próbuję użyć ViewBag w mojej aplikacji, mam wszystkie najnowsze biblioteki DLL, najnowszą wersję MVC 3, ale nadal otrzymuję błąd:

„Nazwa„ ViewBag ”nie istnieje w obecnym kontekście”

Nawet odinstalowałem, a następnie ponownie zainstalowałem MVC 3, a mimo to nie ma zmian.

Nie wierzę też, że biblioteki DLL pojawiają się w GAC.

Jaki może być mój problem? Albo jak dodać dll do GAC?

efleming
źródło
1
Należy pamiętać, że dla wersji 5.2.2.0 plik web.config powinien wskazywać na 5.2.2.0, ale widoki / web.config na 5.1.0.0 dla zestawu MVC
Bart Calixto

Odpowiedzi:

39

Musisz dodać konfigurację Razor specyficzną dla MVC do pliku web.config. Zobacz tutaj: Rozszerzenia Razor HtmlHelper (lub inne przestrzenie nazw dla widoków) nie znaleziono

Użyj narzędzia do aktualizacji MVC 3, aby automatycznie upewnić się, że masz odpowiednie wartości konfiguracyjne.

marcind
źródło
Dzięki! Ten link pomógł! Myślę, że to wszystko jest wynikiem stworzenia strony, która była w wersji beta MVC 3, a kiedy otrzymasz najnowszą wersję, konfiguracje internetowe nie ulegną zmianie. Dzięki!
efleming
Zaktualizowałem swój post z tym, a także z powiązaną poprawką: stevesmithblog.com/blog/ ...
ssmith
Możesz użyć narzędzia do aktualizacji (zobacz zaktualizowaną odpowiedź), aby upewnić się, że konfiguracja jest poprawna.
marcind
3
Tylko uwaga: jeśli masz dodatkowe lokalizacje widoku, tj. Poza normalną ~/Viewslokalizacją, skopiuj również ~/Views/Web.configdo tej lokalizacji.
Dave Thieben
83

Miałem ten sam problem. Okazało się, że brakowało mi ./Views/Web.configpliku, ponieważ utworzyłem projekt z pustej aplikacji ASP.NET zamiast korzystać z szablonu ASP.NET MVC.

W przypadku ASP.NET MVC 5 ./Views/Web.configplik waniliowy zawiera następujące elementy:

<?xml version="1.0"?>

<!-- https://stackoverflow.com/a/19899269/178082 -->
<configuration>
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.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=5.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>

        <!--
                Enabling request validation in view pages would cause validation to occur
                after the input has already been processed by the controller. By default
                MVC performs request validation before a controller processes the input.
                To change this behavior apply the ValidateInputAttribute to a
                controller or action.
        -->
        <pages
                validateRequest="false"
                pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <controls>
                <add assembly="System.Web.Mvc, Version=5.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>

Dodanie ./Views/Web.configpliku zawierającego tę zawartość rozwiązało ten problem.

crimbo
źródło
3
Nareszcie rozwiązanie. Nie wdrożyłem pliku /Views/Web.config na serwerze i ten brakujący plik był przyczyną błędu.
Stack Man
2
wróciłem i skorzystałem z tego rozwiązania po raz drugi! :)
user230910
2
Po zmarnowaniu całego dnia próbując to rozgryźć, zrobiło to dla mnie. Dzięki. Jedyną rzeczą, którą musiałem dodać do tagu <namespaces> w "./Views/Web.config, był; <add namespace="System.Web.Optimization"/>
dunwan
w moim przypadku z jakiegoś powodu elementy nie znajdowały się w katalogu głównym web.config, ale zostały dodane do pliku web.config w sekcji „Widoki”, gdy tworzyłem układ MVC5. Przeniosłem elementy do katalogu głównego web.config i
usunąłem
2
Stary, niech cię Bóg błogosławi. BARDZO mnie to zirytowało.
Dragan B.,
19

Spróbuj wyczyścić i odbudować. W moim przypadku zadziałało.

Ruwan Jayalath
źródło
Nie mogę uwierzyć, że zmarnowałem czas, zastanawiając się, co jest nie tak z moim kodem ... dzięki, zadziałało
Mr_Hmp
irytujące, że to działa ... zawsze zapominam o tym i tracę tyle czasu ... nie powinno być konieczne
TCC
w moim przypadku musiałem usunąć folder paczek z rozwiązania i wyczyścić
Nerdroid
9

Miałem ten sam problem w rozwiązaniu, które zostało zaktualizowane do MVC 5 w Visual Studio 2015.

W pliku web.config w folderze Views (nie w katalogu głównym web.config) zaktualizowałem numer wersji, o którym mowa w <configSections>od 2.0.0.0do 3.0.0.0.

<configuration>
    <configSections>
      <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      </sectionGroup>
  </configSections>
Jon Crowell
źródło
2
Dziękuję Ci bardzo! Ta wersja jest szalona. Za każdym razem, gdy się odwracam, aktualizacje MS są wszędzie na sobie. Ling do SQL został zastąpiony przez Entity Framework, MVC przeszedł od 1 do 6, dalej i dalej.
JustJohn
Dzięki, rozwiązałem mój problem z VS2017.
QuickNull
Naprawiono aplikację mvc 5 VS 2019.
MrDywar,
6

Po wypróbowaniu różnych rzeczy okazuje się, że była to pamięć podręczna VS. Możesz rozwiązać ten problem, usuwając pliki pamięci podręcznej znajdujące się w:

C: \ Users \ your.name.here \ AppData \ Local \ Microsoft \ VisualStudio \ 14.0 \ ComponentModelCache

Zamknąłem projekt, usunąłem pliki w tej ścieżce i ponownie otworzyłem projekt, wyczyściłem rozwiązanie i ponownie je zbudowałem, a problem został rozwiązany

Pliki zostaną ponownie utworzone po następnym uruchomieniu programu Visual Studio

Wilson Vallecilla
źródło
U mnie to zadziałało również w wersji 15 (VS 2017). Prawdopodobnie nigdy bym tego nie pomyślał ... dzięki za duże oszczędności czasu, Wilson & Silver!
Paul Schroeder,
Ścieżka uniwersalna%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat
3

Miałem ten sam problem i crimbo dało mi właściwą wskazówkę, było to spowodowane przez plik ./Views/Web.config, który był obecny, ale nie zawierał odpowiednich przestrzeni nazw, jak sądzę ...

Utworzyłem pusty projekt MVC5 i zaimportowałem jego ./Views/Web.config do mojego istniejącego projektu, a czerwone fale pod każdym użyciem ViewBag zniknęły!

JJP
źródło
Visual Studio 2013, utworzono pusty projekt sieci Web z zaznaczonym polem MVC. Tworzy całą strukturę plików z minimalnymi odniesieniami do przestrzeni nazw MVC. Dodałem prosty kontroler i widok. Wystąpiły błędy kompilacji „Typ lub nazwa przestrzeni nazw„ Ajax ”nie istnieje w przestrzeni nazw„ System.Web.Mvc ”(czy brakuje odwołania do zestawu)”. Edytor plików wyświetla również ostrzeżenie „Nazwa„ ViewBag ”nie istnieje w bieżącym kontekście”. Przejdź do referencji projektu, znajdź System.Web.Mvc, ustaw kopię lokalną na true. wyczyść kompilację i przebuduj, to rozwiązało mój problem.
Kagan Agun
2

Miałem ./Views/Web.Configplik, ale ten błąd wystąpił po opublikowaniu strony. Okazuje się, że właściwość akcji kompilacji w pliku została ustawiona na Nonezamiast Content. Zmieniam to na Contentdozwolone publikowanie, aby działało poprawnie.

Kcoder
źródło
1

Miałem ten problem po zmianie domyślnej przestrzeni nazw aplikacji w oknie dialogowym Właściwości.

./Views/Web.Config zawierało odniesienie do starej przestrzeni nazw

csharpsql
źródło
Tak, i wyświetla komunikat o błędzie w zupełnie niewłaściwym miejscu .. warto sprawdzić, czy istnieją wszystkie przestrzenie nazw, do których odnoszą się WSZYSTKIE pliki web.config - miałem starą przestrzeń nazw w pliku web / config obszaru, powodując wiele problemów
user230910
1

W moim przypadku zmiana strony: Wersja na odpowiednią wartość rozwiązała mój problem, dla mnie poprawna wartość to (2.0.0.0 zamiast 3.0.0.0):

<appSettings>
        <add key="webpages:Version" value="2.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>
Robin Leblond
źródło
1

Po wypróbowaniu wszystkich podejść żadne z nich nie działało dla mnie, ponieważ wszystko, co mam, to poprawne konfiguracje. Wreszcie

Usunięcie wszystkich plików z „temp” i „% temp%” z systemu pomogło rozwiązać ten problem.

Otwórz polecenie Uruchom (Windows + R) i wpisz powyższe ciągi i usuń wszystkie pliki tymczasowe.

Mistrz
źródło
Dziękuję Ci! Po wypróbowaniu wszystkiego to zadziałało.
user390480
1

Jeśli wypróbowałeś wszystkie dostępne odpowiedzi i nadal nie możesz znaleźć odpowiedzi, może to rozwiązać problem. Jeśli masz różne konfiguracje rozwiązań, takie jak debugowanie, wydanie itp., Ustaw ścieżkę wyjściową projektu na „bin” i skompiluj projekt. Przywróć zmianę po kompilacji.

Ścieżka wyjściowa projektu

VS szuka bibliotek dll w folderze bin

Naga Sailesh
źródło
1

Próbowałem już usunąć plik bin i obj i ponownie uruchomić VS, ale nie miałem szczęścia.

Miałem też ten problem wiele razy i za każdym razem jest to trudne do rozwiązania. Często jest to spowodowane tym, że plik web.config nie ma poprawnej wersji jednego z odnośników. Oznacza to, że kliknij odwołanie w programie Visual Studio, aby wyświetlić wersję na karcie właściwości, a następnie dopasuj ją do wersji w plikach web.config.

Innym sposobem jest (jeśli to możliwe) uaktualnienie do nowszej wersji platformy .NET Framework, a następnie usunięcie plików bin / obj i ponowne uruchomienie programu Visual Studio. Mogę tylko założyć, że zmienia coś w

Szybkie sprawdzenie różnicy między plikiem csproj w rzeczywistości nie pokazuje żadnej większej różnicy ... Ale różnice, które pokazał, były następujące (dodałem (usunąłem), aby pokazać starą linię)

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> (remove)
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>(remove)
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>

W pliku Web.Config (nie tym w widoku)

<add key="webpages:Version" value="2.0.0.0" /> (remove)
<add key="webpages:Version" value="3.0.0.0"/>

Dodał również (do tego samego pliku web.config), ale ręcznie go usunąłem

 <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

Na koniec w konsoli Menedżera pakietów dodaj update-package

Uruchom witrynę lokalnie i zobacz wszelkie błędy kompilacji, które zostały naprawione przez mój drugi akapit (pasujące do wersji odniesień)

Dave
źródło
0

Zaktualizowałem strony internetowe: Wersja w folderze ./Views/Web.Config, ale to ustawienie było również obecne w web.config w katalogu głównym. Zaktualizuj oba lub usuń z katalogu głównego web.config

user1412699
źródło
0

Jak już wspomniał @Wilson Vallecilla. Wykonaj poniższe czynności, aby usunąć pamięć podręczną:

Aby znaleźć pliki, postępuj zgodnie z poniższą ścieżką:

C:\Users\your.name.here\AppData\Local\Microsoft\VisualStudio\14.0\ComponentModelCache

Usuń wszystkie cztery pliki:

  • Microsoft.VisualStudio.Default.cache
  • Microsoft.VisualStudio.Default.catalogs
  • Microsoft.VisualStudio.Default.err
  • Microsoft.VisualStudio.Default.external

Zamknąłem projekt, usunąłem pliki w tej ścieżce i ponownie otworzyłem projekt, wyczyściłem rozwiązanie i ponownie je zbudowałem, a problem został rozwiązany

Pomocne jest również usunięcie tymczasowych plików ASP.NET. C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

To działa dla mnie.

Dzięki!

Trilok Pathak
źródło
0

W przypadku MVC5 na wypadek, gdybyś tworzył aplikację od podstaw. Musisz dodać plik web.config do folderu Views i wkleić w nim następujący kod.

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.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=5.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>
</configuration>

Zauważ, że w przypadku MVC 3 będziesz musiał zmienić wersję na 3.0.0.0 o godz

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

Aby zobaczyć zmiany, konieczne może być zamknięcie i ponowne otwarcie strony * .cshtml.

Ashish Kaul
źródło