关于asp.net mvc:Razor查看抛出“名称’模型’在当前上下文中不存在”

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>

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

为什么会这样?我怎么修?


我想你把视图文件夹中的web.config文件弄乱了。

创建一个面向同一.NET框架的新项目,并将其视图/web.config文件复制到当前项目的视图/web.config文件之上。这可以解决你的问题。

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


确保在您的站点web.config和视图目录web.configappSettings部分中都有以下内容

1
 

MVC5使用:

1
 

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


以下是我所做的:

  • 关闭Visual Studio
  • 删除SUO文件
  • 重新启动Visual Studio
  • .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>

    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>

    更新代码后,请确保清理并重新生成解决方案。希望这能帮到你!


    现有的答案对我来说都不起作用,但我通过比较不同项目的.csproj文件发现了什么对我起作用。以下对.csprojXML文件的手动编辑为我解决了Razor IntelliSense问题,也许这可以帮助其他尝试过所有其他答案但都无效的人。关键是删除False的任何实例:

    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文件。我把它加回去了,没问题。


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


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