書籍転載:ASP.NET MVC 5 実践プログラミング

書籍転載:ASP.NET MVC 5 実践プログラミング

アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド[Razor]

2014年10月28日

リソース指定は、相対パスよりも、アプリケーションルートからの絶対パスの方がよい。そのような絶対パスを生成するUrlオブジェクトの機能を解説。書籍転載の13本目(基礎編「4-3-3」)。

  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、秀和システム発行の書籍『ASP.NET MVC 5 実践プログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『ASP.NET MVC 5 実践プログラミング』の詳細や購入は秀和システムのサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

4-3-3 アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド

 外部スクリプトやスタイルシート、画像などのリソースを指定する場合、「../Content/logo.gif」のようなパスを指定することは避けるべきです。たとえば、

http://localhost:82/Samples/View/Link

でアクセスした場合には(「Samples」は仮想ディレクトリ名とします)、正しく「~/Content/logo.gif」を取得できるかもしれません。しかし、リクエストURLが、

http://localhost:82/Samples/View/Link/12345

のように変化してしまったらどうでしょう。「../Content/logo.gif」は「~/View/Content/logo.gif」を指すことになってしまいますので、正しく画像ファイルを取得できなくなってしまうのです。

 このような不具合を避けるために、リソースを指定する場合*14にはかならず「/Samples/Content/logo.gif」のようなアプリケーションルートからの絶対パスでもって指定するべきです。このような絶対パスを生成するのが、Urlオブジェクトの役割です。

  • *14 具体的には、<script>/<link>/<img>/<iframe>要素などのsrc/href属性を指定する場合です。

【Note】IIS Expressで仮想ディレクトリを設定する

 以降の結果は、仮想パス(仮想ディレクトリのパス)が「/Samples」に設定されている場合の結果です(デフォルトは「/」)。IIS Expressの仮想パス設定を変更するには、ソリューションエクスプローラーから[Properties]を選択し、開いたプロパティシートの[Web]タブ-[サーバー]-[プロジェクトのURL]を「http://localhost:82/Samples」のように指定してください。

図4-3 仮想ディレクトリの設定
(1)Url.Contentメソッド

 Url.Contentメソッドを利用することで、「~/」(ルート演算子 *15)で始まる仮想パスを、アプリケーションルートからの絶対パスに変換できます。

  • *15 アプリケーションルートを表すASP.NETの演算子です。
Razor
@Url.Content("~/Content/Site.css")
リスト4-17 Views/Link/Link.cshtml

       

/Samples/Content/Site.css

 ただし、ASP.NET MVC 4以降では、href、src属性などで指定された「~/...」はRazorが自動的に判別して、絶対パスに変換してくれます。よって、以下はいずれも意味的に等価です。

Razor
<img src="~/Content/hoge.gif" alt="サンプル画像" />
<img src="@Url.Content("~/Content/hoge.gif")" alt="サンプル画像" />

 あえて冗長な記述を優先する理由はありませんので、属性の中ではUrl.Contentメソッドを利用すべきではありません。

(2)Url.Actionメソッド

 指定されたコントローラー/アクション名、その他パラメーター情報をもとに、アプリケーションルートからの絶対パスを生成します。パスを組み立てる際の考え方は、Html.ActionLinkメソッドのそれと同様です。

Razor
@Url.Action(
  "Details",    // アクション名
  "Result",     // コントローラー名
  new { id = "980-NI-05038-8", charset = "utf8" } // ルートパラメーター
)
リスト4-18 Views/Link/Link.cshtml

       

/Samples/Result/Details/980-NI-05038-8?charset=utf8

(3)Url.RouteUrlメソッド

 もうひとつ、ルートパラメーターから絶対パスを生成するRouteUrlメソッドもあります。

Razor
@Url.RouteUrl(
  "Default",    // ルート名
  new { controller = "Result", Action = "Details",
        id = "980-NI-05038-8", charset = "utf8" } // ルートパラメーター
)
リスト4-19 Views/Link/Link.cshtml

       

/Samples/Result/Details/980-NI-05038-8?charset=utf8

 ルート名だけを指定した場合には、現在のコントローラー/アクションをもとにURL文字列を組み立てます。

Razor
@Url.RouteUrl("Default")
リスト4-20 Views/Link/Link.cshtml

       

/Samples/Link/Link

※以下では、本稿の前後を合わせて5回分(第11回~第15回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

11. リンク/エンコード関連のビューヘルパー|ハイパーリンクを生成する - ActionLinkメソッド[Razor]

リンク/エンコード関連のビューヘルパー紹介の1つ目として、アンカータグを生成するためのメソッドの基本的な使い方を解説する。書籍転載の11本目(基礎編「4-3-1」)。

12. ルート定義からハイパーリンクを生成する - RouteLinkメソッド[Razor]

リンク先のルートパラメーターを指定したアンカータグを生成できるRouteLinkメソッドの使い方を解説。書籍転載の12本目(基礎編「4-3-2」)。

13. 【現在、表示中】≫ アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド[Razor]

リソース指定は、相対パスよりも、アプリケーションルートからの絶対パスの方がよい。そのような絶対パスを生成するUrlオブジェクトの機能を解説。書籍転載の13本目(基礎編「4-3-3」)。

14. HTMLエンコードを無効にする - Html.Rawメソッド[Razor]

デフォルトで実行されるHTML予約文字のエスケープ処理を無効にして生のままHTMLコードを出力するためのHtml.Rawメソッドについて解説。書籍転載の14本目(基礎編「4-3-4」)。

15. テンプレート関連のビューヘルパー|テンプレートの標準の挙動[Razor]

「テンプレートヘルパー」とも呼ばれるDisplayFor/EditorForメソッドについて紹介。また、テンプレートヘルパーの標準的な挙動を確認する。書籍転載の15本目(基礎編「4-4-1」)。

イベント情報(メディアスポンサーです)

サイトからのお知らせ

Twitterでつぶやこう!