「ASP.NET MVC/ルーティング」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
[[ASP.NET MVC]]における'''ルーティング'''とは、リクエストURI(俗にいうURL)を、予め決められたルールに基づいていくつかの文字列に分解し、その内容に従って適切な[[コントローラクラス]]を選択し、[[アクションメソッド]]を実行すること言う。
+
[[ASP.NET MVC]]'''ルーティング’’’とは、リクエストURIを、あらかじめ決められたルールに基づいていくつかのパラメータに分解し、その内容に従って適切なコントローラ・クラスを選択、実行すること言う。
  
 
== ルーティング設定 ==
 
== ルーティング設定 ==
 
ルーティング設定についてはASP.NET MVCアプリが格納されているディレクトリの「Global.asax」に記載されている。
 
ルーティング設定についてはASP.NET MVCアプリが格納されているディレクトリの「Global.asax」に記載されている。
  
Global.asaxの主要部分(Visual Studio 2010で自動生成した場合のデフォルト設定)
 
 
<source lang="csharp">
 
<source lang="csharp">
 
routes.MapRoute(
 
routes.MapRoute(
22行目: 21行目:
 
</source>
 
</source>
  
第1引数は基本的に何でもよいそうだ。あとから誰がみても意味の伝わるわかりやすいルーティング名前を書いておく。
+
第1引数は基本的に何でもよいそうだ。
  
 
重要なのは第2引数。URLをスラッシュ区切りでコントローラー名、アクション名、パラメーターの3つに分解するように設定している。
 
重要なのは第2引数。URLをスラッシュ区切りでコントローラー名、アクション名、パラメーターの3つに分解するように設定している。
  
 
第3引数はコントローラー名、アクション名、パラメーターのそれぞれが省略された場合に設定されるデフォルト値を設定している。
 
第3引数はコントローラー名、アクション名、パラメーターのそれぞれが省略された場合に設定されるデフォルト値を設定している。
 
この例では省略しているが第4引数以降もある。
 
色々あるのでググれ。
 
 
=== URLから引数を取得する ===
 
ASP.NET MVCではルーティング定義に従い、URL文字列からアクションに渡す引数を自動抽出してくれる。
 
 
たとえば下記のルーティング定義では、「 http://localhost/watch/abc 」というURLにアクセスすると、VideoContorollerクラスのWatchメソッドが呼ばれ、videoName引数に「abc」という文字列が格納されている。
 
<source lang="csharp">
 
            routes.MapRoute(
 
                "Video",
 
                "watch/{videoName}",  // ← これ超重要。
 
                new { controller = "Video", action = "Watch" }
 
            );
 
</source>
 
 
上記の{videoName}の部分に入っている文字列を取得するには、Watchメソッドに同名の引数を用意しておくと自動的に渡される。
 
<source lang="csharp">
 
class VideoController : Controller
 
{
 
    public ActionResult Watch(
 
        string videoName // ←←←←← この変数名をあわせる
 
    )
 
    {
 
        return new ContentResult() {
 
            ContentType = "text/plain",
 
            Content = "Video : Watch : " + videoName
 
        };
 
    }
 
}
 
</source>
 
 
=== スラッシュを含む文字列の取得 ===
 
ASP.NET MVCのルーティング定義で自動抽出される個々の引数には、基本的に半角スラッシュ「/」を含めることができない。URLエンコードしても無駄な抵抗。たとえば前述の例で「 「 http://localhost/watch/abc/123 」にアクセスすると404エラーとなる。
 
 
ただし、ルーティング定義の最後の変数名の頭に半角アスタリスク「*」を付けると、以降すべてが抽出される。これには半角スラッシュも含まれるので、半角スラッシュを含みたい引数は最後にもってくると良い。また、常に1個の引数だけとるようにしてアクションメソッド内で強引にパースするという荒技もある。
 
 
前述の例を以下のように修正するとvideoName変数にちゃんと「abc/123」という文字列が渡されると思う。
 
<source lang="csharp">
 
            routes.MapRoute(
 
                "Video",
 
                "watch/{*videoName}",  // ← 頭にアスタリスク
 
                                      //    これでURL文字列のwatch/以降の全部が
 
                                      //    videoName変数に格納されるようになる
 
                new { controller = "Video", action = "Watch" }
 
            );
 
</source>
 
 
すごいぜ[[stackoverflow.com]]<ref>http://stackoverflow.com/questions/591694/url-encoded-slash-in-url</ref>。
 
  
 
== 関連項目 ==
 
== 関連項目 ==

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート:

このページは 1 個の隠しカテゴリに属しています: