it-swarm-pt.tech

Erro razor intellisense: o recurso 'método de extensão' não pode ser usado porque não faz parte da especificação de idioma ISO-2 C #

Objetivo:

  • Use cshtml Razor templates para formatar dados
  • Incorpore modelos cshtml Razor na Biblioteca de classes como Embedded Resources
  • Use instruções Linq e métodos de extensão no modelo cshtml

Criei um novo projeto de biblioteca de classes e adaptei as instruções Scott Hanselman sobre como integrar o MVC3 em um aplicativo WebForms para que ele funcionasse em uma Biblioteca de Classes. Então eu uso o pacote NuGet RazorEngine para aplicar o modelo a um objeto.

Até agora, funciona muito bem, com um soluço: O intellisense não reconhece instruções Linq ou métodos de extensão (uma parte muito importante do MVC) ao editar arquivos cshtml.

Portanto, para o seguinte arquivo cshtml:

@model Customer[]

@Model.Count()

@if (Model.Where(customer => customer.Type == 'New').Any())
{
    <span>Found at least one new customer.</span>
}

... exibe os seguintes erros:

Feature 'extension method' cannot be used because it is not part of the ISO-2 C# language specification

Feature 'lambda expression' cannot be used because it is not part of the ISO-2 C# language specification

Alguém sabe o que estou perdendo? Agradeço antecipadamente - passei horas procurando a resposta para isso.


Alguns detalhes adicionais

O seguinte é meu web.config na pasta Visualizações :

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="Host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.web>
    <httpHandlers>
      <add path="*" verb="*" type="System.Web.HttpNotFoundHandler" />
    </httpHandlers>
    <pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add Assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
  </system.web>

  <system.webServer>  ...  </system.webServer>
</configuration>

E eu adicionei um web.config arquivo para a raiz do projeto. Ele contém o seguinte:

<configuration>
<system.web>
  <compilation debug="true" targetFramework="4.0">
    <assemblies>
      <add Assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add Assembly="System.Web.Helpers, Version=1.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=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
  </compilation>
  ...
  <pages>
    <namespaces>
      <add namespace="System.Web.Helpers" />
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
      <add namespace="System.Web.WebPages" />
    </namespaces>
  </pages>
</system.web>
...
</configuration>

E aqui estão as referências para o projeto:

Project References

A Biblioteca de classes possui uma estrutura de destino de .NET Framework 4 e em Configurações avançadas de compilação, a versão do idioma é definida como C# 3.0.

Atualizar

O projeto cria e executa corretamente ao usar métodos de extensão e o Linq. É apenas o intellisense que lança o erro.

31
Matt

Depois de mais algumas horas de ajustes, descobri que tinha algo a ver com as extensões padrão do Visual Studio que não estavam sendo carregadas corretamente.

Eu estava recebendo o erro:

O pacote 'VSTS for Application Professional da camada de dados do SQL Server para profissionais de banco de dados' não foi carregado corretamente

Encontrei a resposta em no Microsoft Connect .

Como corrigir

1) Execute os seguintes instaladores na mídia do Visual Studio:

\ WCU\DAC\DACFramework_enu.msi

\ WCU\DAC\DACProjectSystemSetup_enu.msi

\ WCU\DAC\TSqlLanguageService_enu.msi

2) Reinicie o VS

Espero que isso possa ser útil para outra pessoa.

4
Matt

A chave para resolver esse problema é adicionar a seguinte tag ao seu app.config ou web.config

<system.web>
    <compilation debug="false" targetFramework="4.0" />
</system.web>

Nota: Em alguns casos, é necessário descarregar e recarregar o projeto.

26
DinohJ

Tentei todas as soluções para esse erro que consegui encontrar em qualquer lugar da Web e não tive sorte.

Finalmente, esse erro desapareceu (e meu IntelliSense funcionou), copiando os blocos extras de configuração do MVC do arquivo web.config do meu projeto para o arquivo app.config do meu projeto.

Parece que o Visual Studio não respeita o web.config (pelo menos algumas de suas partes) em um projeto de biblioteca C # antigo simples.

O arquivo app.config do meu projeto tem a seguinte aparência:

<appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add Assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Helpers, Version=1.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=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Boa sorte.

24
Evan Machusak

A solução para mim foi mudar o tipo de projeto

1. Descarregue o projeto

Projeto 2.Edit

3.Adicione a linha abaixo (dependendo da versão do MVC do seu projeto) logo após o ProjectGuid

MVC 4

<ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

MVC 3

<ProjectTypeGuids>{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

@ Matt

Tente adicionar isso ao Web.Config na raiz do projeto (não na pasta Views)

<configuration>
...
 <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="Host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>


...  
</configuration>
8
SimonGates

Adicione uma seção "system.codedom" ao seu arquivo de configuração (app.config em um aplicativo de console), por exemplo:

<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs;cshtml" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v4.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
1
Jailhouse Joe

Tivemos exatamente esse problema em nosso projeto hoje - ele podia ser replicado entre os membros da equipe, portanto não era um problema de instalação. O Intellisense está compilando as páginas no código 2.0 e não no CS # 3.

Eu o localizei para adicionar uma referência da Web ao projeto de classe (usando o MVCContrib para tê-la como uma biblioteca de referência conforme http://lostechies.com/erichexter/2009/11/01/ asp-net-mvc-portable-areas-via-mvccontrib/ )

Peguei o WebReference e o movi para outro projeto e resolvi o problema. Foi um pouco caçador, então espero que isso ajude outra pessoa!

1
The Coder