名称'模型'在MVC3的当前上下文中不存在


119

我在项目中添加了一个cshtml页面。当我尝试向其添加以下声明时,出现错误:“名称'model'在当前上下文中不存在”。

@model xyz.abc.SomeClass

我检查了引用,所有引用都到位。我在视图文件夹中添加了一个web.config,但是并没有解决它。

我有什么想念的吗?


如果您正在寻找MVC4解决方案,Adam的答案是正确的,您需要从主web.config中找到正确的版本号,并在此处使用它。MVC4视图文件夹web.config缺少<host>行,并从根web.config复制了一个(它的其他值可能有所不同,因此请检查您的值)并将其放入视图中。然后,我们关闭了该项目,然后将其重新加载到Visual Studio中,就成功了。
Farrukh Subhani

Answers:


238

更新:如果您使用的是MVC的较新版本,则将应用相同的过程,只需确保在web.config的<host>行中使用正确的版本号即可。

好吧,我发现自己遇到了与您所做的相同的事情,经过进一步的研究,我发现了问题所在!

您需要为Views文件夹包含默认的MVC3 web.config。MVC3有两个:一个位于应用程序的根目录中,另一个位于views文件夹中。这有一部分包含的名称空间。确保您的外观如下所示:

  <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复制到views文件夹中。

重要说明:完成此操作后,需要关闭文件并重新打开它。瞧!智慧!


1
我无法将其标记为答案,但这也是我的问题。忘记将这些部分添加到web.config。
戴夫

是的,希望我能将您的答案标记为答案。我坚持了一段时间(第一次尝试转换为Razor失败后放弃了),这一直都是问题所在。谢谢!
Brian Donahue 2012年

3
对我不起作用。或者,至少,即使我在Views文件夹的web.config中拥有所有这些设置,有时我也会获得智能感知,有时却没有。
汤姆·连扎

非常感谢你!它保护了我的一天!
谢尔盖(Sergey)2012年

9
确保在您的MAINweb.config文件中更新到最新版本(此处为MVC 5)<add key="webpages:Version" value="3.0.0.0" />
Simon_Weaver 2014年

30

当我创建一个新区域来组织页面时,我遇到了同样的问题。我的结构看起来像:

网络项目

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

在WebProject下的“视图”文件夹中创建的视图工作正常,但是在NewArea下创建的视图引发以下错误:

名称“模型”在当前上下文中不存在。

为了解决这个问题,我将WebProject下Views文件夹中的web.config复制到NewArea中的Views文件夹。见下文。

网络项目

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

之所以遇到这个问题,是因为我使用添加->新文件夹来添加文件夹,从而手动创建了这个新区域。我应该右键单击该项目,然后选择添加->区域。这样,Visual Studio就可以正确设置区域了。


2
+1 ...我只是注意到由于某些原因未包含web.config,很高兴找到您的答案来解决我的问题
pollirrata 2012年

2
我知道这已经很老了,但实际上我今天也遇到了同样的问题,因此我想对这个答案表示感谢。:)
Ricky Mutschlechner

我也有同样的问题,也有类似的解决方案。我Views/Web.config引用的是System.Web.Mvc.MvcWebRazorHostFactory版本5.0.0.0,并且我有一个第三方区域引用了v4.0,并且视图相互配合。我Views/Web.config回到v4.0,一切正常。
Hammer的代码,2014年

特别是您关于使用Views文件夹中的web.config覆盖web.config的评论,这有助于解决此问题。由于某些疯狂的原因,仅使内容完全相同是行不通的。AAARRRGGGHHH!;)
瑞安·维特斯

就我而言,我使用robocopy将本地版本与服务器版本同步,但排除了所有web.config文件。在服务器版本中没有web.config文件的情况下,将出现此错误。
Will Wu

11

如果您的视图位于类库程序集中,这对于在项目之间重用共享视图很有用,那么仅执行Adam所建议的操作可能还不够。即使如此,我仍然有问题。

在项目根目录的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>

而这在您的views文件夹中的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>

这对我有用。现在,我在一个非MVC项目中的视图上具有智能感知并且没有编译错误,然后可以从多个MVC网站引用该错误。


1
这是用于Web项目中的web.config文件,还是用于类库中的web.config文件?
–TheJerm

7

当我无意中在根目录中有路径/ about的视图文件(About.cshtml)的副本时,我遇到了这个问题。(不是views文件夹)将文件移出根目录后,问题就消失了。


1
谢谢!我一直在生气,遇到同样的问题,这就是答案;-)
Rob

凉!我还记得发疯。:)
James Lawruk 2012年

我在根目录的文件夹中有一些.cshtml文件,这仅导致视图中的文件夹失败... while(true){bashHeadToWall; }。谢谢。
matt.j.crawford '16

7

使用VS2012和VS2013也有类似的问题。
将以下行添加到主web.config中的<appSettings>中可以正常工作:

<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

更新:2015/5/5对于您的MVC 5项目,您需要在/views/web.config中将Version设置为5.0.0.0。

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

1
Yup发现了导致问题的版本5.2.0.0,但是将其更改为5.0.0.0可以解决该问题!谢谢。
vendettamit 2015年

5

当您使用以下代码在视图顶部声明模型时:

@model MyModel

您需要在下面将其引用大写,例如:

@Html.Encode(Model.MyDisplayValue)

我相信,在浏览文件夹将是本作的主要原因缺失的Web.config,但如果是固定的,但问题仍然存在,请检查您使用的型号,而不是模型来引用它的来源。


1
这解决了错误时,问题是,你想引用你的模型在自己的代码视图,当你做你自己的助手,不依赖于像lambda表达式等
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

因为我在System.Web.Razor中有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
webconfig的appsettings补充为我解决了。尽管我认为这<add key="webpages:Version" value="2.0.0.0" />是驱动因素,但不需要其他设置。
Shoe

1
对于MVC 5,这必须3.0.0.0是,但这是非常重要的!
西蒙·韦弗

2

这是一个可怕的错误,但是:

确保您的“ 视图”中有Web.config文件远程。也许您跳过了通过Ftp程序的过滤器上传的内容。


2

我在Areas / MyArea / Views / web.config下缺少了web.config。一旦添加,它就可以正常工作。这是与MVC 5和.NET4.5一起使用的


我的矿井也丢失了,在这个站点的帮助下,我又恢复了工作。 forums.asp.net/t/…–
Perposterer

0

还有另一个原因。就我而言,我已将index.cshtml文件复制到Web根文件夹(位于Views文件夹之外)作为远程服务器的备份。

因此,我不断更改/views/web.config,不断更改/views/home/index.cshtml并不断发生错误……直到在views文件夹之外找到/index.cshtml,将其删除并确定为止一切恢复正常!


0

我遇到了同样的问题,但就我而言,唯一改变的是我卸载了Visual Studio 2012并安装了Visual Studio2013。我打开了解决方案,但我一直得到相同的解决方案 The name 'model' does not exist in current context在每个Razor视图中都错误。

我的同事建议检查VS2013的更新。安装VS2013 Update 1之后,我停止出现此错误。


1
我在VS2013 Update 2中遇到此错误。使用Update 1,它运行良好。尚未找到解决方案。我尝试卸载Update 2,但是在打开cshtml文件后导致VS崩溃。
iheartcsharp 2014年

我有同样的问题与VS2013更新2
EricP

0

检查视图目录上的配置文件。在添加MVC 4/5的密钥


0

重新安装nuget为我解决了

PM>安装软件包Microsoft.AspNet.Razor-版本3.2.3


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恢复丢失的软件包。刷新,就完成了!



0

我遇到了同样的问题,然后找到了解决方案。解决方案是:

  1. 关闭Visual Studio
  2. 删除SUO文件
  3. 重新启动Visual Studio

名为.suo文件是在同一文件夹中的隐藏文件的.svn解决方案文件存在。希望能成功!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.