Razor View throwing “The name 'model' does not exist in the current context”
在我的MVC 4应用程序中进行重大重构之后,Razor在调试视图时显示此错误:
The name 'model' does not exist in the current context.
这是违规的代码行:
1 | @model ICollection<DataSourceByActive> |
我知道
为什么会这样?我怎么修?
我想你把视图文件夹中的web.config文件弄乱了。
创建一个面向同一.NET框架的新项目,并将其视图/web.config文件复制到当前项目的视图/web.config文件之上。这可以解决你的问题。
另外,正如Dudeman3000所评论的,如果您的MVC项目中有区域,它们也都有
确保在您的站点web.config和视图目录
1 |
MVC5使用:
1 |
(它只存在于主web.config文件中。)
以下是我所做的:
.suo文件是与.svn解决方案文件位于同一文件夹中的隐藏文件,包含Visual Studio用户选项。
我也遇到了同样的问题,我创建了一个新项目,并按照gupta在答案中建议的方式复制了web.config文件,但这并没有帮我解决问题。我检查了Alex和Liam的回答,我认为这行一定是从新web.config中复制的,但是看起来新项目本身没有这行(MVC5):
1 |
将该行添加到views/web.config文件中为我解决了这个问题。
在视图文件夹的web.config中更改以下行解决了相同的错误。
从
1 | <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> |
到
1 | <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> |
在我的例子中,我最近从MVC4更新到了MVC5,这使得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关联的正确升级版本。
从@model改为@model为我做了这项工作。
@模型表示视图模型对象类型。@模型表示视图模型对象。
我找到了解决办法。如果要更新Razor版本或MVC 4到5,请更改一些行。
视图/web.config中的旧代码
1 2 3 4 | <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> |
换成
1 2 3 4 | <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> |
在我的例子中,以下代码是有用的。将下面的代码放在web.config文件的views文件夹下。
1 2 3 4 5 6 7 8 | <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> |
更新代码后,请确保清理并重新生成解决方案。希望这能帮到你!
现有的答案对我来说都不起作用,但我通过比较不同项目的
1 2 3 4 5 6 7 8 9 10 | <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:
1 2 3 4 5 6 | <runtime> <dependentAssembly> <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" /> </dependentAssembly> </runtime> |
解决方案是更改为1.0.0.0:
1 2 3 4 | <dependentAssembly> <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/> </dependentAssembly> |
对我来说,这个问题是我最近导入的一个库中的一个冲突的.NET版本。我导入的库是为4.5.2编译的,ASP.NET MVC站点我将它导入到目标4.5中。重新编译后说lib为4.5,该网站将进行编译。
此外,没有编译错误,但该问题被报告为"警告"。因此,如果有任何警告,请务必阅读所有警告。
我在部署到Azure应用程序服务时遇到了同样的问题
在我的例子中,这是因为项目中不包括~/views/web.config。
它在IIsExpress中工作,但是当我部署到Azure时,我得到了相同的错误。由于未包含在.csproj文件中,因此未部署该文件。
解决方案是确保项目中包含~/views/web.config。
如果您转到解决方案资源管理器并单击"显示所有文件"图标,然后打开视图,您可能会看到下面有一个未包含的web.config文件。
把它加进去,重新出版,鲍勃是你叔叔。
在我的例子中,问题是,在将项目从MVC 4升级到MVC 5之后,我不知何故错过了views/web.config中的版本更改:
1 | <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%)。
当我遇到这个问题时,我试图添加一个不在"视图"文件夹中的视图(我想只是为了以不同的方式组织代码)。在视图内部创建视图(按照惯例)解决了这个问题。
在我的情况下,我在前臂的开头失踪了
1 2 3 4 5 6 7 8 9 10 11 | @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> } |
为了解决这个问题,我确保使用nuget和包管理器控制台升级到最新的MVC版本。
安装软件包Microsoft.aspnet.mvc-版本5.2.4
然后升级到最新的Razor版本
安装软件包Microsoft.aspnet.razor-版本3.2.4
然后我更改了所有web.config文件以反映更改。如下所示:
在web.config主文件中,确保webpages:版本正确。在这里可以找到它(忽略其他键):
1 2 3 4 5 6 7 | <configuration> </appSettings> </configuration> |
然后查找程序集中列出的其他版本,对照项目引用中列出的库版本检查程序集的版本!你可能不需要所有这些。
1 2 3 4 5 6 7 8 9 10 11 | <system.web> <compilation debug="true" targetFramework="4.6"> </assemblies> </compilation> </system.web> |
运行时assemblybinding也应该显示"newversion",看看它在哪里读取newversion 5.2.4.0?同时检查所有其他版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <runtime> <dependentAssembly> <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <bindingRedirect oldVersion="1.0.0.0-5.2.4.0" newVersion="5.2.4.0"/> </dependentAssembly> </assemblyBinding> </runtime> |
然后在views web.config部分,确保razor是正确的版本:
1 2 3 4 5 6 7 8 | <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> |
最后是视图web.config的pages部分。
1 2 3 4 5 6 7 8 9 | <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> </controls> </pages> |
如果你像我一样不改变你的项目就接受这个问题,您需要更改放置在视图文件夹中的web.config。只需输入或删除空行就可以写新行。然后保存web.config并重新生成。我的问题用这个解决方案解决了
在我的例子中,我意外地从视图文件夹中删除了web.config文件。我把它加回去了,没问题。
我在打印变量时使用了
您可能会在代码中使用名为