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


200

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

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

这是令人反感的代码行:

@model ICollection<DataSourceByActive>

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

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


关键是“在当前上下文中”。括号未打开或关闭的某处...因此,您的陈述与您认为的无关。
弗洛里斯

1
您可以添加您的控制器代码以及您尝试执行的一些示例标记吗?
scniro

Answers:


244

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

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

另外,正如Dudeman3000所评论的那样,如果您的MVC项目中有Areas,则它们也都具有Views\web.config文件。


20
请记住,如果您的MVC项目中有Areas,它们也都具有Views \ web.config文件!
Dudeman3000 2014年

6
奇怪的是,我在views目录中的web.config很好,但是项目的web.config的网页版本为2.0.0。当我将其设置为3.0.0时,错误检测就消失了。
威廉·T·马拉德

43
This will fix your problem.它没有。
Timwi

2
@AnirudhaGupta问题中的一个。
Timwi

1
我已经将有效的web.config文件复制到了Views文件夹中,但是该文件未包含在项目中。
野猫马特

104

确保该部分的站点Web.config和views目录Web.config中都包含以下appSettings内容

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

对于MVC5,请使用:

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

(并且它仅存在于主Web.config文件中。)


14
谢谢!对于MVC5,版本号必须为3.0.0.0。(并且它仅存在于 Web.config文件中。)
xec

这是我会说的正确答案,因为我到处都尝试过更改版本号,但最后这是唯一阻止剃刀智慧工作的方法。
Shivam Chopra 2014年

6
这对我有用。进行此更改后,我必须重新启动Visual Studio才能正常工作。
拉夫维

1
我在MVC 5中遇到了这个问题,问题是该密钥存在,但定位版本2.0.0.0而不是3.0.0.0。改变那解决了问题。谢谢!
vaindil '16

我使用了它,但是它起作用了,但是我只将其添加到了视图web.config中。VS重新启动后,Intellisense就出现了。
马特

48

这是我所做的:

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

.suo文件是与.svn解决方案文件位于同一文件夹中的隐藏文件,并包含Visual Studio用户选项。


是的,没有web.config适用于ASP.NET Core应用程序的文件,因此这对我有用(还添加了一些扩展以改善智能感知)。
VMAtm

2
我什至不必删除SUO文件。我刚刚关闭并打开了Visual Studio。
吉姆S

Visual Studio 2019:没有suo文件,已删除.vs文件夹有所帮助。
斯捷潘Havránek

谢谢..这为我做到了。.net Core 2.0 mvc应用程序
roblem

2
Visual Studio 2019在这里为我关闭并重新打开修复了它。谢谢。
JordanGW

26

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

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

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


如果您从asp.net 4.0.0版升级到4.5.1,就会发生这种情况。就我而言,我的主要web.config显示的是webpages:Version = 2.0.0.0,但应为3.0.0.0。更新此值可解决此问题。
Veysel Ozdemir 2015年

15

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

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

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

1
这也对我有用。我已经升级了剃须刀来支持C#6,MVC也必须进行了更新。检查您的System.Web.Mvc程序集参考以确认所需的主要版本。
詹姆斯·威尔金斯

我有同样的问题。将web.config中的所有MVC,Razor等程序集修复到x.0.0.0,让事情再次对我
有用

@JamesWilkins尼斯,为我工作。只是一件事,在那之后删除您的项目.suo文件,然后重新启动VS。

接得好!从.net framework 4.0升级到4.6后,我遇到了这个问题,显然是指向错误的程序集版本。
令人沮丧的

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相关的正确升级版本。


1
如果从MVC 4升级到MVC 5,这是检查的答案。它准确地指出了版本问题,解决了我的问题,几乎没有破坏任何东西的风险。
R. Schreurs

10

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

@model代表视图模型对象类型。@Model代表视图模型对象。


1
我希望我不会忘记这一点!谢谢你的提醒!
迈克

1
我不得不查找此问题的次数令人沮丧。.但是我很高兴这是一个简单的解决方法!
布伦丹·史鲁克

7

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


6

就我而言,以下代码非常有用。将以下代码放置在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>

更新代码后,请确保清洁并重建解决方案。希望这对您有所帮助!


5

现有的答案都不为我工作,但我找到了比较的工作对我来说.csproj不同的项目文件。以下对.csprojXML文件的手动编辑为我解决了Razor-intellisense问题,也许这可以帮助尝试了所有其他答案的其他人都无济于事。关键是去除的任何实例<Private>False</Private><Reference>的:

<ItemGroup>
  <Reference Include="Foo">
    <HintPath>path\to\Foo</HintPath>
    <!-- <Private>False</Private> -->
  </Reference>
  <Reference Include="Bar">
    <HintPath>path\to\Bar</HintPath>
    <!-- <Private>True</Private> -->
  </Reference>
</ItemGroup>

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


您的建议感谢,这也为我工作,不管是什么原因
Scherling

也为我工作。
Alex

在我的案例中,这是唯一可行的选择。我将一个vs2010项目切换到了2019年,并像一个魅力一样工作。保存csproj后,我尝试取消注释像原始文件一样的标记,并且该标记仍在工作...
jefissu

3

由于某种原因,我的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>

3

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

脚步:

  • 打开Visual Studio安装程序(在Windows中搜索Visual Studio安装程序)
  • 单击单个组件
  • 在搜索框中输入“ mvc”
  • 检查MVC4框
  • 点击右下角的“修改”

注意:必须关闭Visual Studio

在此处输入图片说明


2

就我而言,问题是将项目从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%)。


2

部署到Azure应用服务时遇到相同的问题

就我而言,这是因为〜/ Views / Web.config没有包含在项目中。

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

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

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

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


1

对我来说,问题是最近导入的其中一个库中的.NET版本冲突。我导入的库是针对4.5.2编译的,而我将ASP.NET MVC站点导入了目标4.5。在将lib编译为4.5后,该网站将编译。

同样,没有编译错误,但是该问题被报告为“警告”。因此,请确保已阅读所有警告。


1

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

安装软件包Microsoft.AspNet.Mvc-版本5.2.4

然后升级到最新的Razor版本

安装软件包Microsoft.AspNet.Razor-版本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也应显示“ newversion”,请参见在哪里读取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部分

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

1

如果像我一样在项目上未做任何更改就解决了此问题,则需要更改放置在“查看文件夹”中的web.config。只需按Enter或删除空行来写新行。然后保存您的web.config并重建。这个解决方案解决了我的问题


0

当我遇到此问题时,我试图添加一个位于“ Views”文件夹之外的视图(我想只是为了以不同的方式组织我的代码)。在视图内部创建视图(按照约定)解决了该问题。


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

这个很重要; 不知道为什么你被低估了。
FlyingV

1
因为它与原始问题无关。
瑞安(Ryan)

0

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


-3

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


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.