Имя 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

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

Используйте инструмент обновления MVC 3, чтобы автоматически убедиться, что у вас правильные значения конфигурации.


Благодарность! Эта ссылка помогла! Я предполагаю, что это все результат создания сайта, который был на бета-версии MVC 3, а затем, когда вы получаете последнюю версию, веб-конфигурации не меняются. Благодарность!
efleming

Я обновил свой пост, добавив
ssmith

Вы можете использовать инструмент обновления (см. Обновленный ответ), чтобы убедиться, что ваша конфигурация верна.
Марсинд

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

в моем случае мне пришлось удалить папку пакетов из решения и выполнить чистку
Nerdroid

9

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

В файле web.config в папке Views (а не в корневом файле web.config) я обновил номер версии, указанный в <configSections>from 2.0.0.0to 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.


Это сработало и в версии 15 (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 - у меня было старое пространство имен в файле 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 до более поздней версии, а затем удалить файлы 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.