Название «модель» не существует в текущем контексте в MVC3 - PullRequest
118 голосов
/ 17 июня 2011

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

@model xyz.abc.SomeClass

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

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

Ответы [ 19 ]

238 голосов
/ 28 июня 2011

Обновление: если вы используете более новую версию 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!

29 голосов
/ 11 января 2012

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

WebProject

  • [] Области
    • [] NewArea
      • [] Контроллеры
      • [] Просмотры
  • [] Контроллеры
  • [] Просмотры
    • Web.config
  • Web.config

Представления, созданные в папке Views в WebProject, работали нормально, но представления, созданные в NewArea, вызывали следующую ошибку: «Имя« model »не существуетв текущем контексте. "Чтобы это исправить, я скопировал файл web.config в папке Views в WebProject в папку Views в NewArea.См. Ниже.

WebProject

  • [] Области
    • [] NewArea
      • [] Контроллеры
      • [] Просмотры
        • Web.config
  • [] Контроллеры
  • [] Просмотры
    • Web.config
  • Web.config

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

11 голосов
/ 05 февраля 2013

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

Попробуйте это в вашем 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 в вашей папке 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=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.

7 голосов
/ 24 августа 2012

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

7 голосов
/ 06 мая 2015

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

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

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

6 голосов
/ 06 мая 2015

Обновление: 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>
5 голосов
/ 24 августа 2012

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

@model MyModel

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

@Html.Encode(Model.MyDisplayValue)

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

3 голосов
/ 30 января 2013

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

  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 голосов
/ 16 марта 2016

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

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

2 голосов
/ 16 марта 2013

Мне понадобилось много времени, чтобы решить эту проблему, но, наконец, я надеюсь, что я решил ее в 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 , поэтому я изменил пространство имен бритвы на 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}.

Это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...