web-dev-qa-db-ja.com

Razorインテリセンスエラー:機能「拡張メソッド」はISO-2 C#言語仕様の一部ではないため、使用できません

ゴール:

  • Cshtml Razorテンプレートを使用してデータをフォーマットする
  • Cshtml RazorテンプレートをクラスライブラリにEmbedded Resourcesとして埋め込みます
  • CshtmlテンプレートでLinqステートメントと拡張メソッドを使用する

新しいクラスライブラリプロジェクトを作成し、MVC3をWebFormsアプリケーションに統合してクラスライブラリで機能させる方法について、 Scott Hanselman's の手順を採用しました。次に、NuGetパッケージRazorEngineを使用して、テンプレートをオブジェクトに適用します。

これまでのところ、1つのしゃっくりでうまく機能します:cshtmlファイルを編集するとき、IntelliSenseはLinqステートメントまたは拡張メソッド(MVCのかなり重要な部分)を認識しません。

したがって、次の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

誰かが私が不足しているものを知っていますか?事前に感謝します-これに対する答えを探すのに何時間も費やしました。


追加の詳細

以下は、Viewsフォルダ内のweb.configです。

<?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を使用すると、プロジェクトが正しくビルドおよび実行されます。エラーをスローするのは、単なるインテリセンスです。

31
Matt

数時間いじくり回した後、標準のVisual Studio拡張機能が正しく読み込まれていないことが原因であることがわかりました。

私はエラーを受け取りました:

「VSTS for Database Professionals SQL Serverデータ層アプリケーション」パッケージが正しく読み込まれませんでした

Microsoft Connect で答えを見つけました。

修正方法

1)Visual Studioメディアから次のインストーラーを実行します。

\ WCU\DAC\DACFramework_enu.msi

\ WCU\DAC\DACProjectSystemSetup_enu.msi

\ WCU\DAC\TSqlLanguageService_enu.msi

2)VSを再起動します

これが他の誰かの助けになることを願っています。

4
Matt

この問題を解決する鍵は、app.configまたはweb.configに次のタグを追加することです

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

注:場合によっては、プロジェクトのアンロードと再ロードが必要です。

26
DinohJ

私はこのエラーのすべての解決策を試しましたが、Webのどこにでも見つかり、うまくいきませんでした。

プロジェクトのweb.configファイルからプロジェクトのapp.configファイルに追加のMVC構成ブロックをコピーすることで、最終的にこのエラーが消えました(そしてIntelliSenseが機能しました)。

Visual Studioは、プレーンな古いC#ライブラリプロジェクトのweb.config(少なくともその一部)を尊重していないようです。

プロジェクトの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>

幸運を。

24
Evan Machusak

私の解決策は、プロジェクトの種類を変更することでした

1.プロジェクトをアンロードする

2.プロジェクトを編集する

3. ProjectGuidの直後に(プロジェクトのMVCバージョンに応じて)以下の行を追加します。

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

これを、(Viewsフォルダーではなく)プロジェクトのルートの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>
8
SimonGates

「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
Jailhouse Joe

今日のプロジェクトでは、まさにこの問題がありました。これは、チームメンバー間で複製できるため、インストールの問題ではありませんでした。 Intellisenseは、CS#3ではなく2.0コードにページをコンパイルしています。

私はそれを追跡して、クラスプロジェクトにWeb参照を追加しました(MVCContribを使用してそれを参照ライブラリとして使用します http://lostechies.com/erichexter/2009/11/01/asp-net-mvc -portable-areas-via-mvccontrib /

WebReferenceを削除して別のプロジェクトに移動し、問題を修正しました。かなりのハンティングを行ったので、これが他の人の役に立つことを願っています!

1
The Coder