Razor View抛出“名称'模型'在当前上下文中不存在”

时间:2013-10-31 01:38:33

标签: asp.net-mvc asp.net-mvc-4 razor

在我的MVC 4应用程序中进行了重大重构之后,Razor在调试视图时显示了这个错误:

  

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

这是令人讨厌的代码行:

@model ICollection<DataSourceByActive>

我知道@model的使用是正确的。

为什么会这样?我该如何解决?

24 个答案:

答案 0 :(得分:216)

我认为你搞砸了位于Views文件夹中的web.config文件。

创建一个针对同一.NET框架的新项目,并将其Views / web.config文件复制到当前项目中的文件之上。这将解决您的问题。

另外,正如Dudeman3000评论的那样,如果你的MVC项目中有区域,那么它们也都有Views\web.config个文件。

答案 1 :(得分:86)

确保您在web.config部分的网站web.config和views目录appSettings中都有以下内容

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

对于MVC5使用:

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

(它只存在于主Web.config文件中。)

答案 2 :(得分:39)

这是我做的:

  1. 关闭Visual Studio
  2. 删除SUO文件
  3. 重新启动Visual Studio
  4. .suo文件是与.svn解决方案文件位于同一文件夹中的隐藏文件,包含Visual Studio用户选项。

答案 3 :(得分:24)

我有同样的问题,我创建了一个新项目,并按照Gupta的回答中的建议复制了web.config文件,但这对我来说没有解决问题。我检查了Alex和Liam的回答,我认为这行必须是从新的web.config复制的,但看起来新项目本身没有这行(MVC5):

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

将这一行添加到views / web.config文件为我解决了这个问题。

答案 4 :(得分:13)

更改视图文件夹的web.config中的以下行解决了同样的错误。

System.Collections.Generic.IEnumerable<Changeset>

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

答案 5 :(得分: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-api-2

最重要的是,您需要检查web.config和Views / web.config中的所有版本号引用,以确保它们引用与MVC 5关联的正确升级版本。

答案 6 :(得分:7)

我在Visual Studio 2019中使用了MVC4项目-事实证明VS 2019不支持现成的MVC 4。您必须安装它。

步骤:

  • 打开Visual Studio安装程序(在Windows中搜索Visual Studio安装程序)
  • 单击单个组件
  • 在搜索框中写“ mvc”
  • 选中mvc4-box
  • 点击右下角的“修改”

注意:必须关闭Visual Studio

enter image description here

答案 7 :(得分:6)

我找到了解决方案。 如果您想更新剃刀版本或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也必须改变。

答案 8 :(得分:6)

从@model改为@Model为我完成了这项工作。

@model表示View Model对象类型。 @Model表示View Model对象。

答案 9 :(得分:5)

就我而言,以下代码有用。将下面的代码放在Views文件夹下的Web.config文件中。

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

更新代码后,请务必清理并重建解决方案。我希望这会帮助你!

答案 10 :(得分:4)

没有一个现有的答案对我有用,但是通过比较不同项目的 routes: [ { path: '/login', name: 'Login', component: Login }, { path: '/', component: Index, children: [ { path: '/users', name: 'Users', component: Users }, { path: '/owners', name: 'Owners', component: Owners }, { path: '/writers', component: Writers, children: [ { path: 'junior', name: 'Junior', component: JuniorWriters }, { path: 'senior', name: 'Senior', component: SeniorWriters } ] } ] } ] 文件,我发现了没有成功对我有用。以下对.csproj XML文件的手动编辑为我解决了Razor-intellisense问题,也许这可以帮助尝试了所有其他答案的其他人无济于事。关键是要删除.csproj中的<Private>False</Private>的所有实例:

<Reference>

我不知道那些人是怎么到达那里的或者他们到底是做什么的,也许比我聪明的人可以添加这些信息。我很高兴终于解决了这个问题。

答案 11 :(得分:2)

出于某种原因,我的web.config在oldVersion属性中具有 0.0.0.0

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

答案 12 :(得分:1)

在我的情况下,问题是在将项目从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后,一切正常。

此外,由于此问题,每次打开.cshtml文件时,Visual Studio 2015 Community Edition都会开始抨击CPU(空闲时使用率为30-40%)。

答案 13 :(得分:1)

在部署到Azure应用服务时,我遇到了同样的问题

在我的情况下,这是因为〜/ Views / Web.config没有包含在项目中。

它在IIS Express中工作,但是当我部署到Azure时,我遇到了同样的错误。由于未包含在.csproj文件中,因此未部署它。

解决方案是确保〜/ Views / Web.config包含在项目中。

如果转到解决方案资源管理器并单击“显示所有文件”图标,然后打开“视图”,则可能会在其中查看未包含的Web.config文件。

添加它,重新发布,然后鲍勃成为你的叔叔。

答案 14 :(得分:1)

对我来说,问题是我最近导入的一个库中存在冲突的.NET版本。我导入的库是为4.5.2和ASP.NET MVC站点编译的,我将它导入到目标4.5。重新编译4.5的lib后,该网站将被编译。

此外,没有编译错误,但该问题被报告为“警告”。因此,如果有任何警告,请务必阅读所有警告。

答案 15 :(得分:0)

当我遇到这个问题时,我试图在我的“Views”文件夹之外添加一个视图(只是以不同方式组织我的代码)。在视图中创建视图(按照惯例)解决了它。

答案 16 :(得分: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>
    }

答案 17 :(得分:0)

为了解决这个问题,我确保使用NuGet和Package Manager Console升级到最新的MVC版本。

安装包Microsoft.AspNet.Mvc -Version 5.2.4

然后升级到最新的Razor版本

安装包Microsoft.AspNet.Razor -Version 3.2.4

然后我更改了所有web.config文件以反映更改。正如您将在下面看到的那样:

在主web.config文件中,确保webpages:version正确无误。这是它可以找到的地方(忽略其他键):

<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应该显示&#34; newversion&#34;同样,看看它在哪里读取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>

而Lastlt则是Views Web.Config的页面部分

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

答案 18 :(得分:0)

如果你像我一样对你的项目没有任何改变就解决了这个问题, 您需要更改放置在View Folder中的web.config。 只需按Enter或删除空行写新行。然后保存您的web.config并重建。 用这个解决方案解决了我的问题

答案 19 :(得分:0)

就我而言,我是无意中从Views文件夹中删除了web.config文件。我把它加回来了,没关系。

答案 20 :(得分:0)

这里似乎存在3个版本号设置,彼此之间必须正确:

  1. ... System.Web.Mvc, Version=x.x.x.x ...(在各个地方〜\ Views \ web.config)
  2. ... System.Web.WebPages.Razor, Version=x.x.x.x ...(在各个地方〜\ Views \ web.config)
  3. <add key="webpages:Version" value="x.x.x.x" />(在〜\ web.config中) NB:根web.config

对我有用的组合:

组合1:

System.Web.Mvc, Version=4.0.0.0

System.Web.WebPages.Razor, Version=2.0.0.0

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

组合2:

System.Web.Mvc, Version=5.2.7.0

System.Web.WebPages.Razor, Version=3.0.0.0

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

最后的观察结果是webpages:Version设置似乎是可选的。至少在当前问题的情况下,删除它似乎没有负面影响。

答案 21 :(得分:0)

我在 nopCommerce 中遇到了这个问题,我将插件的视图部分复制到 nopcommerce\Plugins 下的输出文件夹,但该视图需要是嵌入式资源。所以 .csthml 文件的错误构建操作是“内容”,它应该是“嵌入式资源”,不需要复制。

答案 22 :(得分:-3)

我在打印变量时使用@Model而不是model来解决问题。

答案 23 :(得分:-8)

您可能会在代码中使用名为model的变量。