Интеллектуальная ошибка бритвы: Нельзя использовать функцию «метод расширения», поскольку она не является частью спецификации языка C # ISO-2 - PullRequest
31 голосов
/ 20 декабря 2011

Цель:

  • Используйте шаблоны cshtml Razor для форматирования данных
  • Вставить шаблоны Rashor cshtml в библиотеку классов как Embedded Resources
  • Использование Linq операторов и методов расширения в шаблоне cshtml

Я создал новый проект библиотеки классов, затем адаптировал инструкции Скотта Хансельмана о том, как интегрировать MVC3 в приложение WebForms, чтобы заставить его работать в библиотеке классов. Затем я использую пакет NuGet RazorEngine, чтобы применить шаблон к объекту.

Пока что он отлично работает, с одним икотацией: Intellisense не распознает операторы Linq или методы расширения (довольно важная часть MVC) при редактировании файлов cshtml.

Так для следующего файла cshtml:

@model Customer[]

@Model.Count()

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

... отображает следующие ошибки:

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

Кто-нибудь знает, что мне не хватает? Заранее спасибо - я часами искал ответ на этот вопрос.


Некоторые дополнительные детали

Вот мой web.config в папке Views :

<?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>

И я добавил web.config файл в корень проекта. Он содержит следующее:

<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>

А вот и ссылки на проект:

Project References

Библиотека классов имеет целевой фреймворк .NET Framework 4, а в разделе «Дополнительные параметры сборки» языковая версия установлена ​​на C# 3.0.

Обновление

Проект строится и работает правильно при использовании методов расширения и Linq. Это просто intellisense, который выбрасывает ошибку.

Ответы [ 6 ]

26 голосов
/ 26 октября 2013

Ключом к решению этой проблемы является добавление следующего тега в ваш app.config или web.config

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

Примечание. В некоторых случаях требуется выгрузка и перезагрузка проекта.

24 голосов
/ 13 декабря 2012

Я перепробовал все решения этой ошибки, которые я мог найти везде в Интернете, и мне не повезло.

Я наконец-то заставил эту ошибку исчезнуть (и мой IntelliSense заработал), скопировав дополнительные блоки конфигурации MVC из файла web.config моего проекта в файл app.config моего проекта.

Кажется, Visual Studio не уважает web.config (по крайней мере, некоторые его части) в простом старом проекте библиотеки C #.

Файл app.config моего проекта выглядит следующим образом:

<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>

Удачи.

8 голосов
/ 25 ноября 2012

Решением для меня было изменение типа проекта

1.Загрузить проект

2. Редактировать проект

3.Добавить строку ниже (в зависимости от версии MVC вашего проекта) сразу после 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

Попробуйте добавить это в Web.Config в корне проекта (не в папке представлений)

<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>
4 голосов
/ 20 декабря 2011

После нескольких часов работы я обнаружил, что это как-то связано со стандартными расширениями Visual Studio, которые загружаются некорректно.

Я получил ошибку:

Пакет 'VSTS for Database Professionals Sql Server Data уровня Application' загружен неправильно

Я нашел ответ на в Microsoft Connect .

Как исправить

1) Запустите следующие установщики с носителя Visual Studio:

\ WCU \ DAC \ DACFramework_enu.msi

\ WCU \ DAC \ DACProjectSystemSetup_enu.msi

\ WCU \ DAC \ TSqlLanguageService_enu.msi

2) Перезапустить VS

Надеюсь, это может помочь кому-то еще.

1 голос
/ 03 мая 2016

Добавьте раздел «system.codedom» в файл конфигурации (app.config в консольном приложении), например:

<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 голос
/ 04 января 2012

Сегодня у нас была именно эта проблема в нашем Проекте - она ​​могла быть воспроизведена среди членов команды, поэтому не была проблемой при установке.Intellisense компилирует страницы в код 2.0, а не в CS # 3.

Я разыскал его, добавив веб-ссылку на проект класса (используя MVCContrib, чтобы получить ее в качестве справочной библиотеки согласно http://lostechies.com/erichexter/2009/11/01/asp-net-mvc-portable-areas-via-mvccontrib/)

Взял WebReference, переместил его в другой проект и устранил проблему, немного поохотился, так что надеюсь, что это поможет кому-то еще!

...