在MVC3中,当前上下文中不存在名称为'model'的变量。

119

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

@model xyz.abc.SomeClass

我检查了引用,它们都在正确的位置。我在视图文件夹中添加了一个 web.config,但那并没有解决问题。

我是否漏掉了什么?


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

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

我发现自己遇到了和你一样的问题,在进一步研究后,我找到了问题所在!

您需要在Views文件夹中包含默认的MVC3 web.config。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文件复制到你的views文件夹中。

重要提示:一旦完成上述操作,你需要关闭并重新打开该文件。就这样!智能感知功能就有了!


3
对我不起作用。或者至少有时候我可以使用智能感知,但有时候却不能,尽管我已经在Views文件夹中的web.config中进行了所有设置。 - Tom Lianza
我之前在web.config文件中有这些条目,但是在创建新的mvc应用程序并从其中复制文件后,它可以正常工作。谢谢! - schmoopy
相同的解决方案适用于MVC5,只需记得在“host”行中将版本更改为5.0.0.0即可。 - c0y0teX
9
请务必在MAIN web.config文件中更新到最新版本(对于MVC 5,这里是<add key="webpages:Version" value="3.0.0.0" />)。 - Simon_Weaver
谢谢。我解决了我的问题,我建议遇到这个错误的人检查你的视图的Web配置,特别是Razor和MVC版本。 - arslanaybars
显示剩余6条评论

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

WebProject

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

在WebProject的Views文件夹下创建的视图运行良好,但是在NewArea下创建的视图会抛出以下错误:

当前上下文中不存在名称为'model'的变量。

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

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版本,而我有一个第三方区域引用了4.0版本,并与视图一起配合。我将Views/Web.config设置回了v4.0,一切都正常了。 - Codes with Hammer
正是你关于用 Views 文件夹中的 web.config 覆盖原有文件的评论帮助我解决了这个问题。仅仅让两个文件内容完全相同,出于某种疯狂的原因并不能解决问题。啊啊啊啊啊!;) - Ryan Vettese
在我的情况下,我使用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>

而在你的视图文件夹中的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

我曾经在使用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

7

我遇到了这个问题,原因是我在根目录下意外地复制了视图文件(About.cshtml),而该路由的路径是/about。一旦我将该文件移出根目录,问题就解决了。


1
谢谢!我刚刚为同一个问题烦恼得要发疯,这就是答案;-) - Rob
太酷了!我也记得自己曾经疯狂过。 :) - James Lawruk
我在根目录的一个文件夹中有一些.cshtml文件,这导致我的视图中只有该文件夹失败了... while(true) { bashHeadToWall; }。谢谢。 - matt.j.crawford

6
更新:2015年5月5日 对于您的MVC 5项目,您需要在/views/web.config中将版本设置为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
找到了版本为5.2.0.0的问题所在,但将其更改为5.0.0.0后问题得到解决!谢谢。 - vendettamit

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

```python model = YourModel() ```

@model MyModel

您需要在以下关于 IT 的引用中使用大写字母,例如:

@Html.Encode(Model.MyDisplayValue)

我相信Views文件夹中缺少web.config是造成这个问题的主要原因,但如果已经修复了这个问题仍然存在,那么请检查在源代码中是否使用 Model 而不是 model 来引用它。


1
这解决了一个错误,当你在视图中尝试引用自己代码中的模型时,比如当你创建自己的帮助程序而不依赖于lambda表达式等。 - JohnC

3
我也遇到了这个问题,但我的情况略有不同。
其中一个视图文件夹被意外地移动到项目的根目录下。这导致路由project_root/SignUp/ViewNameproject_root/Views/SignUp/ViewName之前的匹配。这导致了@model错误。
将视图文件夹移回适当的位置后,该文件夹在项目根目录下以某种方式被重新创建。这一次,它是空的。/SignUp/ViewName可以正常工作,但是/SignUp/会抛出403 - Forbidden: Access is denied.错误。必须从项目根目录中删除整个文件夹。
希望这能帮助到别人。我花了几个小时认为这个问题是由我们最近从MVC 3升级到MVC 4引起的。请注意:升级问题应仅在MVC 2和MVC 3之间发生。如果您在较新版本上看到此问题,则可能不是由于升级造成的。

2

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

请确保在你的Remote中的View文件夹下有Web.config文件。也许你在使用FTP程序上传时跳过了它,需要检查一下FTP程序的筛选器。


2

我在Areas/MyArea/Views目录下缺少web.config文件,添加后问题得以解决。这是使用MVC 5和.NET4.5时的情况。


我的也出了问题,通过这个网站的帮助,我又让它正常工作了。https://forums.asp.net/t/1978969.aspx?+Unrecognized+configuration+section+system+web+webPages+razor+ - Perposterer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接