Назва "ViewBag" не існує в поточному контексті


89

Я намагаюся використовувати ViewBag у своєму додатку, у мене є всі останні DLL-файли, остання версія MVC 3, але все-таки я все ще отримую помилку:

"Назва" ViewBag "не існує у поточному контексті"

Я навіть видалив, а потім перевстановив MVC 3, але змін немає.

Крім того, я не вірю, що DLL відображаються в GAC.

У чому може бути моя проблема? Або як додати DLL-файли до GAC?


1
Майте на увазі, для 5.2.2.0 web.config повинен вказувати на 5.2.2.0, а Views / web.config - 5.1.0.0 для збірки MVC
Барт Калікто

Відповіді:


39

Вам потрібно додати специфічну для MVC конфігурацію Razor до вашого web.config. Дивіться тут: Розширення Razor HtmlHelper (або інші простори імен для подань) Не знайдено

Використовуйте інструмент оновлення MVC 3, щоб автоматично переконатися, що у вас є правильні значення конфігурації.


Дякую! Це посилання допомогло! Я припускаю, що все це результат створення сайту, який працював на MVC 3 Beta, і тоді, коли ви отримуєте останню версію, веб-конфігурації не змінюються. Дякую!
efleming

Я оновив свою публікацію цим, а також відповідним виправленням: stevesmithblog.com/blog/…
ssmith

Ви можете скористатися інструментом оновлення (див. Оновлену відповідь), щоб переконатися, що ваша конфігурація правильна.
marcind

3
Тільки примітка: якщо у вас є додаткові місця перегляду, тобто за межами звичайного ~/Viewsрозташування, скопіюйте також ~/Views/Web.configу це місце.
Дейв Тібен

83

У мене була та сама проблема. З’ясувалося, що мені не вистачало ./Views/Web.configфайлу, оскільки я створив проект із порожньої програми ASP.NET замість того, щоб використовувати шаблон ASP.NET MVC.

Для ASP.NET MVC 5 ./Views/Web.configфайл ванілі містить наступне:

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

Додавання ./Views/Web.configфайлу, що містить цей вміст, вирішило цю проблему для мене.


3
Рішення нарешті. Я не розгорнув файл /Views/Web.config на сервер, і цей відсутній файл був причиною помилки.
Stack Man

2
повернувся і використав це рішення вдруге! :)
user230910

2
Протративши цілий день, намагаючись це зрозуміти, це зробило це для мене. Дякую. Єдине, що мені потрібно було додати до тегу <namespaces> у "./Views/Web.config; <add namespace="System.Web.Optimization"/>
dunwan

у моєму випадку з якихось причин елементи не були в кореневій web.config, але їх додали до web.config у розділі «Перегляди», коли я створював макет MVC5. Я переніс елементи до кореневого web.config і видалив "зайвий" (??) web.config
JDPeckham

2
Чувак, хай Бог благословить тебе за це. Мене це НАДІЙНО дратувало.
Драган Б.

19

Спробуйте почистити та відновити. У моєму випадку це спрацювало.


Не можу повірити, що я даремно витратив час на роздуми, що не так з моїм кодом ... дякую, це спрацювало
Mr_Hmp

розлючуючи, що це працює ... я завжди забуваю це робити і витрачаю стільки часу ... не потрібно
TCC

у моєму випадку мені довелося видалити папку package з рішення та зробити чистку
Nerdroid

9

У мене була та ж проблема в рішенні, яке було оновлено до MVC 5 у Visual Studio 2015.

У файлі web.config у папці Views (не в кореневій web.config) я оновив номер версії, зазначений у <configSections>з 2.0.0.0до 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>

2
Велике спасибі! Ця версія речі божевільна. Кожного разу, коли я перевертаю оновлення MS, вони перекривають одне одного. Ling to SQL замінюється Entity Framework, MVC пішов від 1 до 6, і далі.
JustJohn

Дякую, виправлено мою проблему з VS2017.
QuickNull

Виправлена ​​програма VS 2019 mvc 5.
MrDywar

6

Спробувавши різні речі, виявляється, це був кеш VS. Ви можете вирішити цю проблему, видаливши файли кешу, розташовані в:

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

Я закрив свій проект, видалив файли на цьому шляху і знову відкрив свій проект, очистив рішення та створив його знову, і проблема була вирішена

Файли будуть відтворені при наступному запуску Visual Studio


Це спрацювало для мене також у v15 (VS 2017). Я, мабуть, ніколи б не подумав зробити це ... дякую за велику економію часу, Wilson & Silver!
Пол Шредер,

Універсальний шлях%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat

3

У мене була та сама проблема, і Crimbo дав мені правильний підказку, це було викликано файлом ./Views/Web.config, який був присутній, але не містив правильних просторів імен, я думаю ...

Я створив порожній проект MVC5 та імпортував його ./Views/Web.config до свого існуючого проекту, і червоні хвилі під кожним використанням ViewBag зникли!


Visual Studio 2013, створив порожній веб-проект із позначкою MVC. Він створює всю файлову структуру з мінімальними посиланнями на простір імен MVC. Я додав простий контролер і подання. Я отримав помилки компіляції "Ім'я типу або простору імен 'Ajax' не існує в просторі імен 'System.Web.Mvc' (вам бракує посилань на збірку)". У редакторі файлів також відображається попередження "Ім'я 'ViewBag' не існує у поточному контексті". Перейдіть до посилань на проект, знайдіть System.Web.Mvc, встановіть для локальної копії значення true. очистити збірку та відновити, це вирішило мою проблему.
Каган Агун,


2

У мене був ./Views/Web.Configфайл, але ця помилка сталася після публікації сайту. Виявляється, властивість дії збірки у файлі було встановлено Noneзамість Content. Змінивши це на Contentдозволило публікації працювати належним чином.


1

У мене виникла ця проблема після зміни простору імен програми за замовчуванням у діалоговому вікні Властивості.

./Views/Web.Config містив посилання на старий простір імен


Так, і воно видає повідомлення про помилку в абсолютно неправильному місці .. його варто перевірити, чи існують усі простори імен, на які посилаються ВСІ файли web.config - у мене був старий простір імен у веб-/ конфігураційному файлі Зони, що викликало багато проблем
user230910

1

У моєму випадку зміна веб-сторінки: Версія на належне значення вирішило мою проблему, для мене правильним значенням було (2.0.0.0 замість 3.0.0.0):

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

1

Спробувавши всі підходи, жоден з них не працював у мене, оскільки все, що я маю, були правильні конфігурації. нарешті

Видалення всіх файлів із "temp" та "% temp%" із системи допомогло вирішити цю проблему.

Відкрийте команду "Виконати" (Windows + R), введіть вище рядки та видаліть усі тимчасові файли.


Дякую! Спробувавши все, у мене це вийшло.
user390480

1

Якщо ви спробували всі доступні відповіді і досі не можете знайти відповідь, це може вирішити проблему. Якщо у вас різні конфігурації рішень, такі як Debug, Release тощо, тоді встановіть вихідний шлях проекту на 'bin' та скомпілюйте проект. Повернути зміни після компіляції.

Вихідний шлях проекту

VS шукає dll у папці bin


1

Я вже намагався видалити файл bin і obj і перезапустити VS, і мені не пощастило.

У мене також неодноразово виникала ця проблема, і її боляче вирішувати кожного разу. Часто це відбувається через те, що файл web.config не має правильної версії одного з посилань. Це означає, що клацніть на посилання у Visual Studio, щоб побачити версію на вкладці властивостей, а потім порівняти її з версією у файлах web.config.

Інший спосіб - (якщо це можливо) оновлення до пізнішої версії .net framework, а потім видалення файлів bin / obj та перезапуск Visual Studio. Я можу лише припустити, що це щось змінює в

Швидка перевірка різниці між файлом csproj насправді не показує жодної суттєвої різниці ... Але відмінності, які він показав, були (я додав (видалити), щоб показати старий рядок)

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

У файлі Web.Config (не у файлі View)

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

Він також додав (до того ж файлу web.config), але я вручну видалив його

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

Нарешті, у консолі диспетчера пакетів додайте update-package

Запустіть веб-сайт локально та перевірте помилки компіляції, виправлені моїм другим абзацом (збігаються з версіями посилань)


0

Я оновив веб-сторінки: версія в папці ./Views/Web.Config, але цей параметр також був присутній у web.config у кореневій папці. Оновіть обидва файли або видаліть з кореневого web.config


0

Як уже згадував @Wilson Vallecilla. Виконайте наведені нижче дії, щоб видалити кеш:

Будь ласка, дотримуйтесь наведеного нижче шляху, щоб знайти файли:

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

Видаліть усі чотири файли:

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

Я закрив свій проект, видалив файли на цьому шляху і знову відкрив свій проект, очистив рішення та створив його знову, і проблема була вирішена

Також допомагає видалення тимчасових файлів ASP.NET. C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

Це працює для мене.

Дякую!


0

Для MVC5, якщо ви створюєте програму з нуля. Вам потрібно додати файл web.config до папки Views і вставити в нього наступний код.

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

Зверніть увагу, що для MVC 3 вам доведеться змінити версію на 3.0.0.0 на

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

Можливо, вам доведеться ще раз закрити та відкрити сторінку * .cshtml, щоб побачити зміни.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.