Имя «модель» не существует в текущем контексте в MVC3.

119

Я добавил в проект страницу cshtml. Когда я попытался добавить к нему следующее объявление, я получил сообщение об ошибке: «Имя« модель »не существует в текущем контексте».

@model xyz.abc.SomeClass

Я проверил ссылки, все они на месте. Я добавил web.config в папку просмотра, но это не помогло.

Что мне не хватает?

user602737
источник
Если вы ищете решение MVC4, ответ от Адама действителен, вам нужно найти правильный номер версии в вашем основном файле web.config и использовать его здесь. В папке представлений MVC4 web.config отсутствовала строка <host>, она копировалась из корневого web.config (у нее могут быть другие значения, поэтому проверьте свои) и поместила ее в представления. Затем мы закрыли проект и перезагрузили его в Visual Studio, и это помогло.
Фаррух Субхани

Ответы:

238

Обновление: если вы используете более новую версию MVC, применяется тот же процесс, просто убедитесь, что вы используете правильный номер версии в <host>строке web.config .

Что ж, я обнаружил, что испытываю то же самое, что и вы, и после небольшого дополнительного исследования я выяснил, в чем проблема!

Вам необходимо включить MVC3 web.config по умолчанию для папки Views. MVC3 имеет два: один в корне вашего приложения и один для папки представлений. Здесь есть раздел для включенных пространств имен. Убедитесь, что ваш выглядит примерно так:

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

Я предлагаю вам создать новый проект MVC3, а затем просто скопировать созданный для вас web.config в папку представлений.

Важно. После того как вы это сделаете, вам нужно закрыть файл и снова открыть его. Вуаля! Intellisense!

Адам Терлсон
источник
1
Я не могу отметить это как ответ, но это тоже была моя проблема. Забыл добавить эти разделы в web.config.
Дэйв
Да, если бы я мог отметить твой ответ как ответ. Я на какое-то время застрял в этом (сдался после того, как моя первая попытка преобразовать в Razor не удалась), и это была проблема с самого начала. Спасибо!
Брайан Донахью
3
У меня не работает. Или, по крайней мере, иногда у меня появляется intellisense, а иногда нет, хотя у меня все это установлено в web.config в папке Views.
Tom Lianza
Большое спасибо! Это спасло мне день!
Сергей
9
обязательно обновитесь до последней версии (для MVC 5 здесь) в вашем MAINфайле web.config<add key="webpages:Version" value="3.0.0.0" />
Simon_Weaver
30

Я столкнулся с этой же проблемой, когда создал новую область для организации своих страниц. Моя структура выглядела так:

WebProject

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

Представления, созданные в папке Views в веб-проекте, работали нормально, но представления, созданные в NewArea, вызвали следующую ошибку:

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

Чтобы исправить это, я скопировал файл web.config из папки Views в WebProject в папку Views в NewArea. Увидеть ниже.

WebProject

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

Я столкнулся с этим, потому что вручную создал эту новую область, используя Добавить -> Новая папка, чтобы добавить папки. Я должен был щелкнуть проект правой кнопкой мыши и выбрать Добавить -> Область. Тогда Visual Studio позаботилась бы о правильной настройке области.

Пол Сифретт
источник
2
+1 ... Я только что заметил, что по какой-то причине web.config не был включен, рад, что нашел ваш ответ для решения моей проблемы
pollirrata
2
Я понимаю, что это устарело, но сегодня у меня была такая же проблема, поэтому я хотел поблагодарить за этот ответ. :)
Ricky Mutschlechner
У меня была такая же проблема и аналогичное решение. Я Views/Web.configссылался на System.Web.Mvc.MvcWebRazorHostFactoryверсию 5.0.0.0, и у меня была сторонняя область, ссылающаяся на v4.0, и представления работали совместно. Я Views/Web.configвернулся к версии 4.0, и все заработало.
Codes with Hammer
Это был конкретно ваш комментарий о перезаписи web.config тем из папки Views, который помог мне исправить это. просто сделать содержимое одинаковым по какой-то безумной причине не работает. AAARRRGGGHHH! ;)
Райан Веттезе
В моем случае я использую robocopy для синхронизации локальной версии с серверной версией, исключая все файлы web.config. без файла web.config в серверной версии эта ошибка появится.
Will Wu
11

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

Попробуйте это в своем web.config в корне вашего проекта:

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

И это в web.config в папке просмотра:

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

Это сработало для меня. Теперь у меня есть intellisense и нет ошибок компиляции в моих представлениях в проекте, отличном от MVC, на который я затем могу ссылаться с нескольких веб-сайтов MVC.

Грег Джекман
источник
1
Это для файлов web.config в вашем веб-проекте или файлов web.config в вашей библиотеке классов?
theJerm
7

Я столкнулся с этой проблемой, когда у меня случайно была копия файла представления (About.cshtml) для маршрута / about в корневом каталоге. (Не в папке просмотров). Как только я переместил файл из корня, проблема исчезла.

Джеймс Лорук
источник
1
Спасибо! Я просто схожу с ума от той же проблемы, и это был ответ ;-)
Роб
Прохладно! Я тоже помню, как сошел с ума. :)
Джеймс Лорук
У меня было несколько файлов .cshtml в папке в корневом каталоге, что привело к сбою только папки в моих представлениях ... while (true) {bashHeadToWall; }. Спасибо.
matt.j.crawford 04
7

Были аналогичные проблемы с использованием VS2012 и VS2013.
Добавление следующей строки в <appSettings> в основном файле web.config сработало:

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

Если строка уже была там, но говорила 2.0.0.0, изменение ее на 3.0.0.0 сработало.


источник
Это было моей проблемой после выполнения обновления MVC. Он сказал 2.0.0.0, после перехода на 3 все заработало.
FerX32
6

Обновление: 5/5/2015. Для вашего проекта MVC 5 вам необходимо установить версию 5.0.0.0 в вашем /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
источник
1
Да, обнаружена версия 5.2.0.0, которая вызывает проблему, но изменение ее на 5.0.0.0 устранило ее !!! Спасибо.
Vendettamit
5

Пока вы объявляете модель в верхней части представления, используя такой код:

@model MyModel

ссылки на него ниже необходимо писать с заглавной буквы, например:

@Html.Encode(Model.MyDisplayValue)

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

Борк Блатт
источник
1
Это решает ошибку, когда проблема заключается в том, что вы пытаетесь ссылаться на свою модель в собственном коде представления, например, когда вы создаете свой собственный помощник, который не полагается на лямбда-выражения и т. Д.
JohnC
3

Я тоже столкнулся с этой проблемой. Мои обстоятельства были немного другими.

  1. Одна из моих папок просмотра была случайно перемещена в корневой каталог моего проекта. Это привело к project_root/SignUp/ViewNameсопоставлению маршрута раньше project_root/Views/SignUp/ViewName. Это вызвало @modelошибку.

  2. После перемещения представлений обратно в соответствующее место каталог каким-то образом был воссоздан в корне проекта. На этот раз пусто. /SignUp/ViewNameработал, но /SignUp/выкинул 403 - Forbidden: Access is denied.ошибку. Вся папка должна быть удалена от корня проекта.

Я надеюсь, что это поможет кому-то. Я часами полагал, что проблема была вызвана нашим недавним обновлением с MVC 3 до MVC 4. Просто примечание: проблемы с обновлением должны возникать только между MVC 2 и MVC 3. Если вы видите эту проблему в более поздних версиях, вероятно, это не из-за Обновить.


источник
2

Мне потребовалось время, чтобы решить эту проблему, но, наконец, я надеюсь, что решил ее на MVC, что похоже:

Я переустановил ASP.NET 4.5 ( http://www.asp.net/downloads )

Я следил за руководством по обновлению на http://www.asp.net/whitepapers/mvc4-release-notes

НО этот абзац мне не подходит

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

Поскольку у меня есть Razor в System.Web.Razor , я изменил пространство имен razor на System.Web.Razor.

Добавьте это в свой web.config

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

Я добавил ссылку на сборку для всех этих сборок выше

Найдите элемент ProjectTypeGuids и замените {E53F8FEA-EAE0-44A6-8774-FFD645390401} на {E3E379DF-F4C6-4180-9B81-6769533ABE47}.

Вот и все.

Томаш Кубес
источник
1
Дополнение appsettings к webconfig решило эту проблему для меня. Хотя я думаю, что <add key="webpages:Version" value="2.0.0.0" />это движущий фактор, другие настройки не нужны.
Shoe
1
для MVC 5 это должно быть, 3.0.0.0но да, это очень важно!
Simon_Weaver
2

Это ужасная ошибка, но:

Убедитесь, что у вас есть файлы Web.config в вашем представлении на удаленном компьютере . Возможно, вы пропустили загрузку с помощью фильтров вашей FTP-программы.

Pcodea Xonos
источник
2

Мне не хватало web.config в разделе Areas / MyArea / Views / web.config. После добавления он работал нормально. Это было с MVC 5 и .NET4.5

Виктор
источник
Моя тоже отсутствовала, с помощью этого сайта я снова заработал. forum.asp.net/t/…
Perposterer 01
0

Есть еще одна причина. В моем случае мне пришлось скопировать файл index.cshtml в корневую веб-папку (за пределами папки Views) в качестве резервной копии с удаленного сервера.

Итак, я продолжал изменять свой /views/web.config, продолжал изменять свой /views/home/index.cshtml, и ошибка продолжалась ... пока не обнаружил /index.cshtml вне папки просмотров, удалил его и, конечно же, все вернулось в норму!

Нестор
источник
0

Я столкнулся с той же проблемой, но в моем случае изменилось только то, что я удалил Visual Studio 2012 и установил Visual Studio 2013. Я открыл наше решение, но продолжал получать одну и ту же The name 'model' does not exist in current contextошибку в каждом представлении Razor.

Мой коллега предложил проверить наличие обновлений для VS2013. После установки VS2013 Update 1 эта ошибка перестала появляться .

Джон Вашэм
источник
1
Я получаю эту ошибку с обновлением 2 VS2013 . С обновлением 1 все работало нормально. Пока не могу найти решение. Я попытался удалить Обновление 2, но это привело к сбою VS после открытия файла cshtml.
iheartcsharp
У меня такая же проблема с VS2013 Update 2.
EricP 07
0

Проверьте свой файл конфигурации в каталоге просмотров. в добавлении ключа для MVC 4/5

sansalk
источник
0

Переустановка nuget решила это для меня

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

pixelagent
источник
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>
Кевин Дарк
источник
0

У меня такая же проблема после обновления пакетов. Я сделал все, что Вы написали выше в этой теме, но красный цвет, лежащий в основе ключевого слова model, не исчез. Позже было найдено решение: просто удалил папку «package» из каталога моего проекта и перестроил, тем временем позволив NuGet восстановить отсутствующие пакеты. Обновился, и готово!

Peter.k
источник
0

Убедитесь, что ваш файл web.config должен существовать в опубликованных файлах

Араш Фарахани
источник
0

Я столкнулся с той же проблемой, но потом нашел решение. Решение такое:

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

.Suo файл скрытый файл в той же папке , где .svn существует файл решения. Надеюсь, сработает!

Арсман Ахмад
источник