書籍転載:ASP.NET MVC 5 実践プログラミング
アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド[Razor]
リソース指定は、相対パスよりも、アプリケーションルートからの絶対パスの方がよい。そのような絶対パスを生成する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で仮想ディレクトリを設定する
(1)Url.Contentメソッド
Url.Contentメソッドを利用することで、「~/」(ルート演算子 *15)で始まる仮想パスを、アプリケーションルートからの絶対パスに変換できます。
- *15 アプリケーションルートを表すASP.NETの演算子です。
@Url.Content("~/Content/Site.css")
|
▼
/Samples/Content/Site.css
ただし、ASP.NET MVC 4以降では、href、src属性などで指定された「~/...」はRazorが自動的に判別して、絶対パスに変換してくれます。よって、以下はいずれも意味的に等価です。
<img src="~/Content/hoge.gif" alt="サンプル画像" />
<img src="@Url.Content("~/Content/hoge.gif")" alt="サンプル画像" />
|
あえて冗長な記述を優先する理由はありませんので、属性の中ではUrl.Contentメソッドを利用すべきではありません。
(2)Url.Actionメソッド
指定されたコントローラー/アクション名、その他パラメーター情報をもとに、アプリケーションルートからの絶対パスを生成します。パスを組み立てる際の考え方は、Html.ActionLinkメソッドのそれと同様です。
@Url.Action(
"Details", // アクション名
"Result", // コントローラー名
new { id = "980-NI-05038-8", charset = "utf8" } // ルートパラメーター
)
|
▼
/Samples/Result/Details/980-NI-05038-8?charset=utf8
(3)Url.RouteUrlメソッド
もうひとつ、ルートパラメーターから絶対パスを生成するRouteUrlメソッドもあります。
@Url.RouteUrl(
"Default", // ルート名
new { controller = "Result", Action = "Details",
id = "980-NI-05038-8", charset = "utf8" } // ルートパラメーター
)
|
▼
/Samples/Result/Details/980-NI-05038-8?charset=utf8
ルート名だけを指定した場合には、現在のコントローラー/アクションをもとにURL文字列を組み立てます。
@Url.RouteUrl("Default")
|
▼
/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」)。