首页 文章

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

提问于
浏览
153

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

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

这是令人讨厌的代码行:

@model ICollection<DataSourceByActive>

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

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

21 回答

  • 0

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

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

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

  • 1

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

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

    对于MVC5使用:

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

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

  • 1

    这是我做的:

    • 关闭Visual Studio

    • 删除SUO文件

    • 重新启动Visual Studio

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

  • 37

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

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

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

  • 6

    更改视图文件夹的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" />
    
  • 5

    在我的情况下,我最近从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关联的正确升级版本 .

  • -3

    我找到了解决方案 . 如果要更新剃刀版本或mvc 4到5,请更改一些行 .

    Old code in 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>
    

    Replaced with

    <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 也必须改变 .

  • 11

    在我的例子中,以下代码有用 . 将下面的代码放在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>
    

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

  • 1

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

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

  • -8

    现有的答案都不适合我,但我通过比较不同项目的 .csproj 文件找到了 did 对我有用的东西 . 以下对 .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>
    

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

  • 4

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

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

  • 10

    在我的例子中,问题是在将项目从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%) .

  • 0

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

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

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

    它在IIS Express中有效,但当我部署到azure时,我得到了同样的错误 . 由于未包含在.csproj文件中,因此未部署 .

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

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

    添加它,重新发布,然后是你的叔叔 .

  • 24

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

  • 5

    在我的情况下,我在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>
        }
    
  • 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也应该显示“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>
    
  • 0

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

  • 84

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

  • 0

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

  • 207

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

相关问题