しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Razor で名前空間を using する方法と問題点

HTML ヘルパーを作った時には using しないと拡張メソッドなので使えないですよね。

ASPX の時にはルートの Web.config にの namespaces セクションに追記すれば、自動的に using されて使えるようになりました。

<system.web>
  <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" />
      <!-- ここに追記 -->
      <add namespace="MvcApplication1.Helpers" />
    </namespaces>
  </pages>
</system.web>

しかし、Razor を使う場合にはルートの Web.config ではなく Views 内にある Web.config の namespaces セクションに追記する必要があります。

これで cshtml のコンパイルは通って正常に動作するようになるのですが、何故かインテリセンスが動作しません。

@* インテリセンス、ツールチップは出ないがコンパイルは通る *@
@Html.Metadata("Property1", "hau")

cshtml に @using 宣言を追加すればインテリセンスが動作するのですが、全てのビューに書くとか愚かな行為はしたくないですよね。

@using MvcApplication1.Helpers

@* @using を追加するとインテリセンスもツールチップも動作する *@
@Html.Metadata("Property1", "hau")

この挙動は私が VS2010 SP1 を入れているからなのか、仕様なのかは確認できなかったのですが、独自の HTML ヘルパーを使うときには最悪なので何とかしてもらいたいもんですね。

追記

Twitter で教えていただきましたが Web.config を編集後にプロジェクトを閉じて開きなおせば、インテリセンスが SP1 の有無にかかわらず表示されることを確認できました。

でもちょっと微妙な挙動なので修正希望ということで。