在我的 MVC 4 应用程序中进行重大重构后,Razor 在调试视图时显示此错误:
当前上下文中不存在名称“模型”。
这是有问题的代码行:
@model ICollection<DataSourceByActive>
我知道 @model
的用法是正确的。
为什么会这样?我该如何解决?
我认为您弄乱了位于 Views 文件夹中的 web.config 文件。
创建一个针对相同 .NET 框架的新项目,并将其 Views/web.config 文件复制到当前项目中的那个之上。这将解决您的问题。
此外,正如 Dudeman3000 评论的那样,如果您的 MVC 项目中有区域,它们也都有 Views\web.config
文件。
确保您的网站 Web.config
和 appSettings
部分的视图目录 Web.config
中都有以下内容
<add key="webpages:Version" value="2.0.0.0" />
对于 MVC5 使用:
<add key="webpages:Version" value="3.0.0.0" />
(而且它只存在于主 Web.config
文件中。)
3.0.0.0
。 (而且它只存在于 main Web.config 文件中。)
2.0.0.0
而不是 3.0.0.0
。改变它解决了这个问题。谢谢!
这是我所做的:
关闭 Visual Studio 删除 SUO 文件 重启 Visual Studio
.suo 文件是与 .svn 解决方案文件位于同一文件夹中的隐藏文件,并且包含 Visual Studio 用户选项。
ASP.NET Core
应用程序没有 web.config
文件,所以这对我有用(还添加了一些扩展以改进智能感知)。
.vs
文件夹有帮助。
我遇到了同样的问题,我创建了一个新项目并按照 Gupta 的回答中的建议复制了 web.config 文件,但这并没有为我解决问题。我检查了 Alex 和 Liam 的回答,我认为这行肯定是从新的 web.config 复制的,但看起来新项目本身没有这行(MVC5):
<add key="webpages:Version" value="3.0.0.0" />
将该行添加到 views/web.config 文件为我解决了这个问题。
更改视图文件夹的 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" />
System.Web.Mvc
程序集参考以确认您需要的主要版本。
我在 Visual Studio 2019 中使用了 MVC4 项目——结果发现 VS 2019 不支持开箱即用的 MVC 4。你必须安装这个。
脚步:
打开 Visual Studio 安装程序(在 windows 中搜索 Visual Studio 安装程序)
单击单个组件
在搜索框中输入“mvc”
检查 mvc4-box
点击右下角的“修改”
注意:Visual Studio 需要关闭
https://i.stack.imgur.com/AUK2Q.png
从@model 更改为@Model 为我完成了这项工作。
@model 表示视图模型对象类型。 @Model 代表视图模型对象。
就我而言,我最近从 MVC 4 更新到 MVC 5,这严重破坏了 web.config。这篇文章帮助很大。
最重要的是,您需要检查 web.config 和 Views/web.config 中的所有版本号引用,以确保它们引用与 MVC 5 关联的正确升级版本。
我找到了解决方案。如果要将 razor 版本或 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
也必须改变。
就我而言,以下代码很有用。将以下代码放在 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>
更新代码后,请确保清理并重建解决方案。我希望这会帮助你!
现有的答案都不适合我,但通过比较不同项目的 .csproj
文件,我发现确实 对我有用。以下对 .csproj
XML 文件的手动编辑为我解决了 Razor-intellisense 问题,也许这可以帮助其他尝试了所有其他答案但无济于事的人。关键是删除 <Reference>
中的 <Private>False</Private>
的任何实例:
<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>
我不知道那些人是如何到达那里的,也不知道他们到底做了什么,也许比我更聪明的人可以添加这些信息。我很高兴终于解决了这个问题。
出于某种原因,我的 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>
部署到 Azure 应用服务时遇到了同样的问题
就我而言,这是因为 ~/Views/Web.config 未包含在项目中。
它在 IIS Express 中工作,但是当我部署到 azure 时,我得到了同样的错误。由于未包含在 .csproj 文件中,因此未部署它。
解决方案是确保 ~/Views/Web.config 包含在项目中。
如果您转到解决方案资源管理器并单击“显示所有文件”图标,然后打开视图,您可能会在那里看到一个未包含的 Web.config 文件。
添加它,重新发布,鲍勃就是你的叔叔。
就我而言,问题是在将项目从 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 后,一切都开始正常工作。
此外,由于这个问题,Visual Studio 2015 社区版会在我每次打开 .cshtml 文件时开始抨击 CPU(空闲时的使用率为 30-40%)。
对我来说,问题是我最近导入的其中一个库中的 .NET 版本存在冲突。我导入的库是为 4.5.2 编译的,我将 ASP.NET MVC 站点导入到目标 4.5。在为 4.5 重新编译上述 lib 后,该网站将编译。
此外,没有编译错误,但该问题被报告为“警告”。因此,如果有任何警告,请务必阅读所有警告。
如果您像我一样在没有对项目进行任何更改的情况下解决此问题,则需要更改放置在查看文件夹中的 web.config。只需通过 Enter 或 Remove a empty line 编写新行。然后保存您的 web.config 并重建。我的问题用这个解决方案解决了
为了解决这个问题,我确保我使用 NuGet 和包管理器控制台升级到了最新的 MVC 版本。
安装包 Microsoft.AspNet.Mvc -Version 5.2.4
然后升级到最新的 Razor 版本
安装包 Microsoft.AspNet.Razor -Version 3.2.4
然后我更改了所有 web.config 文件以反映更改。正如您将在下面看到的:
在主 web.config 文件中,确保 webpages:Version
键的 value
正确。这是可以找到它的地方(忽略其他键):
<configuration>
<appSettings>
<add key="webpages:Version" value="3.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
然后查找程序集中列出的其他版本,将程序集的 Version
与项目引用中列出的库版本核对!您可能不需要所有这些。
<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>
runtime
assemblyBinding
也应该显示“新版本”,看看它在哪里显示 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 部分中,确保 System.Web.WebPages.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>
最后是 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>
当我遇到这个问题时,我试图添加一个位于我的“视图”文件夹之外的视图(我猜只是为了以不同的方式组织我的代码)。在 Views 中创建视图(按照惯例)解决了它。
就我而言,我意外地从 Views 文件夹中删除了 web.config 文件。我加回来了,没问题。
这里似乎有 3 个版本号设置需要相互正确:
... System.Web.Mvc,Version=xxxx ...(在各个地方〜\Views\web.config)... System.Web.WebPages.Razor,Version=xxxx ...(在各个地方〜\ Views\web.config)
对我有用的组合:
组合一:
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
设置似乎是可选的。至少在当前问题的背景下,删除它似乎没有负面影响。
我在 nopCommerce 中遇到了这个问题,我将插件的视图部分复制到 nopcommerce\Plugins 下的输出文件夹,但视图需要是嵌入式资源。因此.csthml 文件的错误构建操作是“内容”,它应该是“嵌入式资源”,不需要复制。
已经7年了。但是,我的情况有点不同。
所有视图都运行良好。因此,更改 web.config 和 nuget 以获取新库将不起作用,并且可能会引入问题。
我的场景是我一直在做项目 B。项目 B 是项目 A 的克隆。长话短说,很多时间,为了节省时间,我必须将代码从项目 B 复制到项目 A。
这一次,我只是将文件abc.cshtml从项目B复制到项目A中。项目B是使用2015开发的。由于某种原因,这导致了问题。我不知道。无论如何,我删除了 abc.cshtml 并从头开始创建空白 abc.cshtml。然后我选择项目 B 中 abc.cshtml 上的所有内容,并将所有文本复制到项目 A 新创建的 abc.cshtml 中。
我解决了我的问题
就我而言,我在 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>
}
我在打印变量时使用 @Model
而不是仅使用 model
解决了这个问题。
您可能会在代码中使用名为 model
的变量。
This will fix your problem.
它没有。