Бросок Razor View «Имя« модель »не существует в текущем контексте»

201

После значительного рефакторинга в моем приложении MVC 4, и Razor показывает эту ошибку при отладке Views:

Название «модель» не существует в текущем контексте.

Это оскорбительная строка кода:

@model ICollection<DataSourceByActive>

Я знаю, что использование @modelявляется правильным.

Почему это происходит? Как я могу это исправить?

Келан Круммэ
источник
Ключ «в текущем контексте». Где-то скобка не была открыта или закрыта ... Так что ваше утверждение не в том контексте, в котором вы думаете.
Флорис
1
Можете ли вы добавить свой код контроллера вместе с некоторым примером разметки того, что вы пытаетесь сделать?
scniro
Возможный дубликат имени «модель» не существует в текущем контексте в MVC3
Майкл Фрейдгейм

Ответы:

245

Я думаю, что вы испортили файл web.config, который находится в папке Views.

Создайте новый проект, ориентированный на ту же платформу .NET, и скопируйте его файл Views / web.config поверх файла в текущем проекте. Это исправит вашу проблему.

Кроме того, как прокомментировал Dudeman3000, если у вас есть области в вашем проекте MVC, у них Views\web.configтоже есть файлы.

Анирудха Гупта
источник
20
помните, что если у вас есть области в вашем проекте MVC, у них тоже есть файлы Views \ web.config!
Dudeman3000
6
Как ни странно, мой web.config в каталоге views был в порядке, но проект web.config имел версию веб-страниц 2.0.0. Обнаружение ложных ошибок исчезло, когда я сделал это 3.0.0.
Уильям Т. Маллард
43
This will fix your problem.Это не так.
Тимви,
2
@AnirudhaGupta Тот, кто в вопросе.
Тимви
1
Я скопировал действительный файл web.config в папку Views, но он не был включен в проект.
Дикая кошка Мэтт
104

Убедитесь, что у вас есть следующее в вашем сайте Web.configи в каталоге просмотров Web.configв appSettingsразделе

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

Для MVC5 используйте:

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

(И он существует только в основном Web.configфайле.)

Alex
источник
14
Спасибо! Для MVC5 номер версии должен быть 3.0.0.0. (И он существует только в главном файле Web.config.)
xec
Это правильный ответ, я бы сказал, так как я пытался изменить версию «нет», но в конце концов это было единственное, что мешало работе бритвы.
Шивам Чопра
6
Это сработало для меня. Я должен был перезапустить Visual Studio после этого изменения, чтобы все работало.
Равви
1
У меня была эта проблема с MVC 5, проблема была в том, что ключ существовал, но 2.0.0.0вместо версии предназначался для версии 3.0.0.0. Изменение, которое решило проблему. Спасибо!
vaindil
Я использовал это, и это работало, но я только добавил это к представлениям web.config. Intellisense появился сразу после перезагрузки VS.
Мэтт
48

Вот что я сделал:

  1. Закрыть Visual Studio
  2. Удалить файл SUO
  3. Перезапустите Visual Studio

Файл .suo представляет собой скрытый файл в той же папке, что и файл решения .svn, и содержит параметры пользователя Visual Studio.

Марк Шультхайс
источник
Да, нет web.configфайла для ASP.NET Coreприложения, так что это сработало для меня (также добавлены некоторые расширения для улучшения intellisense).
VMAtm
2
Мне даже не пришлось удалять файл SUO. Я просто закрыл и открыл Visual Studio.
Джим С
Visual Studio 2019: нет файла suo, удаление .vsпапки помогло.
Штепан Гавранек
Спасибо .. это сделало это для меня. Приложение MVC .net Core 2.0
проблема
2
Visual Studio 2019 здесь, закрыть и снова открыть исправил это для меня. Спасибо.
JordanGW
26

У меня была та же проблема, я создал новый проект и скопировал файлы web.config, как рекомендовано в ответе Гупты, но это не помогло мне. Я проверил ответ Алекса и Лиама, я подумал, что эта строка, должно быть, была скопирована из нового web.config, но похоже, что сам новый проект не имел этой строки (MVC5):

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

Добавление строки в файл views / web.config решило проблему для меня.

Тарек Шавадфи
источник
Это происходит, если вы обновились с версии 4.0.0 asp.net до 4.5.1. В моем случае мой основной файл web.config показывал веб-страницы: Версия = 2.0.0.0, но должна быть 3.0.0.0. Обновление этого значения решило проблему.
Вейсел Оздемир
15

Изменение следующей строки в web.config папки просмотра решило ту же ошибку.

Из

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

к

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
Винаяк Хегде
источник
1
Это сработало и для меня. Я обновил бритву для поддержки C # 6, и MVC, должно быть, тоже обновился. Проверьте System.Web.Mvcссылку на сборку, чтобы подтвердить основную версию, которая вам нужна.
Джеймс Уилкинс
У меня такая же проблема. исправление всех сборок MVC, Razor и т. д. в web.config до версии x.0.0.0 снова
помогло
@JamesWilkins Хорошо, работал на меня, ты. Только одно, после этого удалите файл проекта .suo и перезапустите VS.
хороший улов! Я столкнулся с этой проблемой после того, как обновил .net Framework 4.0 до 4.6 и, очевидно, указал на неверную версию сборки.
Прашант
10

В моем случае я недавно обновился с MVC 4 до MVC 5, что довольно сильно портит web.config. Эта статья очень помогла.

http://www.asp.net/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web- апи-2

Суть в том, что вам нужно проверить все ссылки на номера версий в файлах web.config и Views / web.config, чтобы убедиться, что они ссылаются на правильные обновленные версии, связанные с MVC 5.

Джастин Скилз
источник
1
Если вы обновились с MVC 4 до MVC 5, это ответ для проверки. Он точно определяет проблемы с версиями, решил мою проблему и практически не рискует что-либо сломать.
Р. Шреурс
10

Переход на @Model с @model сделал работу за меня.

@model представляет тип объекта View Model. @Model представляет объект View Model.

eaglei22
источник
1
Я хотел бы перестать забывать это! Спасибо за напоминание!
Майк
1
Количество раз, когда мне приходится искать эту проблему, разочаровывает ... Но я рад, что это простое решение!
Брендан Слюк
7

Я нашел решение. Если вы хотите обновить версию бритвы или mvc 4 до 5, измените некоторые строки.

Старый код в Views / web.config

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

Заменено на

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

sectionGroup Должно быть, изменить тоже.

ddagsan
источник
6

В моем случае следующий код оказывается полезным. Поместите приведенный ниже код в файл Web.config в папке Views.

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

После обновления кода обязательно очистите и перестройте решение. Я надеюсь, что это поможет вам!

Прах
источник
5

Ни один из существующих ответов не сработал для меня, но я нашел то, что сработало для меня, сравнив .csprojфайлы разных проектов. Следующее ручное редактирование .csprojXML-файла решило проблему Razor-intellisense для меня, возможно, это может помочь кому-то, кто пробовал все остальные ответы безрезультатно. Ключ должен удалить любые экземпляры <Private>False</Private>в <Reference>:

<ItemGroup>
  <Reference Include="Foo">
    <HintPath>path\to\Foo</HintPath>
    <!-- <Private>False</Private> -->
  </Reference>
  <Reference Include="Bar">
    <HintPath>path\to\Bar</HintPath>
    <!-- <Private>True</Private> -->
  </Reference>
</ItemGroup>

Я не знаю, как они попали туда или точно, что они делают, может быть, кто-то умнее меня может добавить эту информацию. Я был просто счастлив, наконец, решить эту проблему.

asontu
источник
Спасибо за предложение, это также работало для меня, по любой причине
Шерлинг
У меня тоже сработало.
Alex
Это был единственный вариант, который работал в моем случае. Я переключил проект vs2010 на 2019 и работал как шарм. После сохранения csproj я попытался раскомментировать теги, как в исходном файле, и он все еще работает ...
jefissu
3

По какой-то причине у моего web.config было 0.0.0.0 в атрибуте oldVersion:

<runtime>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
</runtime>

переход на 1.0.0.0 был решением:

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
  </dependentAssembly>
chemark
источник
3

Я использовал проект MVC4 с Visual Studio 2019 - и оказалось, что VS 2019 не поддерживает MVC 4 "из коробки". Вы должны установить это.

шаги:

  • Открыть установщик Visual Studio (поиск установщика Visual Studio в Windows)
  • Нажмите отдельные компоненты
  • Напишите "mvc" в поле поиска
  • Проверьте mvc4-box
  • Нажмите «Изменить» в правом нижнем углу

ПРИМЕЧАНИЕ: требуется для закрытия Visual Studio

введите описание изображения здесь

Стефан Райер
источник
2

В моем случае проблема заключалась в том, что после обновления проекта с MVC 4 до MVC 5 я почему-то пропустил изменение версии в Views / web.config:

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

У него все еще была старая версия 2.0.0.0. После смены версии на 3.0.0.0 все заработало как надо.

Кроме того, из-за этой проблемы Visual Studio 2015 Community Edition начинал загружать процессор (30-40% при простое) каждый раз, когда я открывал файл .cshtml.

Михай Каракостеа
источник
2

У меня была такая же проблема при развертывании в службе приложений Azure

В моем случае это произошло потому, что ~ / Views / Web.config не был включен в проект.

Это работало в IIS Express, но при развертывании на Azure я получил ту же ошибку. Не будучи включенным в файл .csproj, он не был развернут.

Решением было обеспечить включение ~ / Views / Web.config в проект.

Если вы перейдете в обозреватель решений и нажмете значок «Показать все файлы», а затем откройте «Виды», вы увидите там не включенный файл Web.config.

Добавьте это, переиздайте, и Боб - ваш дядя.

gburton
источник
1

Для меня проблема заключалась в конфликтующей версии .NET в одной из библиотек, которые я недавно импортировал. Библиотека, которую я импортировал, была скомпилирована для 4.5.2, и сайт ASP.NET MVC, которую я импортировал, был предназначен для 4.5. После перекомпиляции указанной lib для 4.5 веб-сайт будет компилироваться.

Кроме того, не было никаких ошибок компиляции, но проблема сообщалась как "предупреждение". Поэтому обязательно прочитайте все предупреждения, если они есть.

Big Gunz
источник
1

Чтобы решить эту проблему, я удостоверился, что обновил до последней версии MVC, используя NuGet и Package Manager Console.

Инсталляционный пакет Microsoft.AspNet.Mvc - Версия 5.2.4.

Затем обновлен до последней версии Razor

Инсталляционный пакет Microsoft.AspNet.Razor - Версия 3.2.4

Затем я изменил все файлы web.config, чтобы отразить это изменение. Как вы увидите ниже:

В основном файле web.config убедитесь, что версия webpages: правильная. Вот где его можно найти (игнорируйте другие ключи):

<configuration>
 <appSettings>
   <add key="webpages:Version" value="3.0.0.0"/>
   <add key="ClientValidationEnabled" value="true"/>
   <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
 </appSettings>
</configuration>

Затем найдите другие версии, перечисленные в сборках, сравните версию сборки с версией библиотеки, указанной в ссылках на ваш проект! Вам может не понадобиться все это.

<system.web>
    <compilation debug="true" targetFramework="4.6">
        <assemblies>
            <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="System.Web.Helpers, Version=3.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=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </assemblies>
    </compilation>
</system.web>

На этапе исполнения AssemblyBinding также должен показывать «newversion», смотрите, где он читает NewVersion 5.2.4.0? Но также проверьте все другие версии.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
        <assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-5.2.4.0" newVersion="5.2.4.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Затем в разделе Views Web.Config убедитесь, что Razor является правильной версией:

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

И, наконец, есть раздел Страницы веб-представлений Views.

    <pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
Кит Аймар
источник
1

если вы решите эту проблему без каких-либо изменений в своем проекте, как я, вам нужно изменить файл web.config, который находится в папке просмотра. просто введите новую строку, нажав Enter или удалите пустую строку. затем сохраните ваш web.config и пересоберите. моя проблема решена с этим решением

Хоссейн Андархора
источник
0

Я пытался добавить представление, которое находилось за пределами моей папки «Представления» (я думаю, просто чтобы организовать мой код по-другому), когда у меня возникла эта проблема. Создание представления внутри Views (как принято) решило эту проблему.

Свейн Терье Гауп
источник
0

В моем случае я пропустил @ в начале foreach

    @foreach (var item in Model)
    {
        <tr class="clickable-row">
            <td class="clickable-field">
                @Html.DisplayFor(modelItem => item.Label)
            </td>
            <td class="clickable-field hidden-xs">
                @Html.DisplayFor(modelItem => item.Value)
            </td>
        </tr>
    }
Себастьян Кастальди
источник
Это важно; Не знаю, почему вы были отклонены.
FlyingV
1
Потому что это не имеет ничего общего с первоначальным вопросом.
Райан
0

В моем случае я случайно удалил файл web.config из папки Views. Я добавил его обратно, и все было в порядке.

Мусульманин Хади
источник
-3

Я решил проблему, используя @Modelвместо того, чтобы просто modelпечатать переменные.

Ник
источник
-8

Вы, вероятно, будете использовать в коде переменную с именем model.

agorshkov23
источник