Razor HtmlHelper Extensions(またはビューの他の名前空間)が見つかりません


167

これがPRまたはベータ版で発生した場合はDunnoですが、で拡張メソッドを作成した場合HtmlHelper、Razorベースのページでは認識されません。

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

<Namespaces>セクションに追加しましたWeb.config

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

しかし、ページを表示しようとすると、コンパイルエラーがスローされます。

@Html.Foo()

WebFormsを使用してページを再作成すると、正常に機能します。どうしたんだ?

回避策

@using SomeNamespace.Extensions私がRazorビューに含めた場合、それは機能しますが、私はむしろそれを持っているだけですWeb.config


2
回避策でもうまくいきません。拡張メソッドはintelliSenseに表示されますが、実行時にコンパイルエラーをスローします。
クラーク、

@using回避策の+1。私の場合はそれを好みます。
ケント

@using回避策は、単一のビューでは問題ありません。しかし、複数のビューの場合、コード管理が問題になります。
Rahatur、2013

回答:


274

ベータ版以降、Razorは名前空間のインポートをグローバルに定義するために別の構成セクションを使用します。あなたにはViews\Web.config、ファイルは、次を追加する必要があります:

<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" />
      <!-- Your namespace here -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

MVC 3アップグレードツールを使用して、適切な構成値を自動的に確保します。

あなたは閉じて、エディタによってピックアップされる変更用のファイルを再度開く必要があること。


1
アセンブリ参照がありませんか?System.Web.Mvc.WebViewPageや、configSectionsセクションのタイプは認識されません。
クラーク、

4
> System.Web.WebPages.Razorへの参照を追加する必要があり、それを整理しました。
TWith2Sugars 2010年

4
うまくいきません。私はMVC 3 RCを使用していますが、ビューフォルダーのweb.configに名前空間を追加しました。それでもRazorページに拡張機能が表示されません。@using <extensionname>を使用するイベントは機能しません。@ TWith2Sugars追加するSystem.Web.WebPages.Razorも見つかりません。System.Web.Razorを追加しましたが、役に立ちませんでした。私は本当にここで立ち往生しています
freddoo 2010

31
更新を確認するためにファイルを開いて閉じるように指示するための+1。
Amir

26
これはルートweb.configではなく、Viewフォルダ内のweb.configであると指摘していただきありがとうございます。
G-Wiz

11

受け入れられた答えが示唆するように、設定ファイルのセクションに追加することで、すべてのビューに「using」を追加できます。

ただし、単一のビューの場合は、

@using SomeNamespace.Extensions


6

Razorを使用するMVC 4アプリケーションでも同じエラーが発生しました。web.configファイルをクリーンアップするために、2つのwebpages:構成値を削除しました。

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

これらの構成値を復元すると、ページが正しくコンパイルされ、.Partial()拡張メソッドに関するエラーが消えました。


5

この問題はVS 2015で発生しました。次の方法で解決しました。

appsettingsで「webpages:Version」を見つけて、バージョン3.0.0.0に更新します。私のweb.configには

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

そして私はそれを更新しました

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

3

このセクションを各ビューフォルダーのweb.configに配置すると解決することがわかりました。

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

1
私は実際に何らかの理由でルートWeb.configは(具体的には、向いて私の問題を引き起こしていたバインディングリダイレクト持っていたことが分かった0.0.0.0-2.0.0.0とする1.0.0.0)、および/View/web.configファイルはそれを上書きしません。(また、私はあなたがすべてでそれを必要とするとは思わない/View/Subfolder/
JoeBrockhaus

1

このエラーは、かみそりエンジンがプロジェクトに適切に関連付けられていないことを示しています。

解決策:[ソリューションエクスプローラー]ウィンドウでWebプロジェクトを右クリックし、[Nugetパッケージの管理...]を選択して、[Microsoft ASP.NET Razor]をインストールします。これにより、適切なパッケージがインストールされていることが確認され、必要なエントリがweb.configファイルに追加されます。



-6

ASP.NET MVC 3 RTMがリリースされているため、Razorの構成セクションは必要ありません。そして、これらのセクションは安全に削除できます。


それが本当かどうか、nick4eva。新しいMVC 3 Webアプリケーションを作成し、Razorビューエンジンを選択した場合、Viewsフォルダーにあるweb.configには、デフォルトでカミソリconfigSectionsが含まれます。それらを無効にすると、実行時にコンパイルエラーが発生します。
MichaelvR 2011年

3
MichaelvR、はい、それは私の間違いでした。ご迷惑をお掛けして申し訳ありません。
nick4eva 2011年

これは、VBベースのMVCプロジェクトにも当てはまりますか?私は私の拡張メソッドへのアクセスなし...持っていないstackoverflow.com/questions/4789273/...
Ropstah

この答えは間違っています。これらの構成エントリは引き続き必要です。新しいプロジェクトテンプレートにはすでにテンプレートが含まれていますが、Mvc 2アプリケーションをアップグレードする場合は、それらを追加する必要があります。
11
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.