SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NET 4.0におけるURLルーティング

アプリケーションで扱うURLを実際の物理的なファイルから切り離す

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

ステップ2:要求を処理するASP.NETページを作成する

 ASP.NET 4.0では、特別なルートハンドラクラスを作成する必要はありません。MapPageRouteメソッドを使用すれば、その処理がすべて、裏で自動的に実行されます。従って残された作業は、要求(AllCategories.aspx、CategoryProducts.aspx、ViewProduct.aspx)を処理するASP.NETページを作成することだけです。デモプログラムのASP.NETページは、非常に簡単なものです。ルーティングパラメータによってCategoriesまたはProductsテーブルからデータベース結果を取得し、それにデータソースコントロールをプログラムによってバインドし、使用します。

 デモプログラムでは、データへのアクセスにLINQ-to-SQLツールを使用しています。App_Codeフォルダの中に、Northwind.dbmlというファイルがあり、そこでNorthwindDataContextクラスを作成します。ViewProduct.aspxページには、商品名、提供企業、単位あたり数量、価格などの関連情報を表示するために定義されたフィールドを持つ、DetailsViewコントロールがあります。このページのコードビハインドクラスのコードを、以下に示します(コードは一部省略されています)。

protected void Page_Load(object sender, EventArgs e)
{
   dvProductInfo.DataSource = new Product[] { Product };
   dvProductInfo.DataBind();
}

private Product _Product = null;
protected Product Product
{
   get
   {
      if (_Product == null)
      {
         string productName = Page.RouteData.Values["ProductName"] as string;

         NorthwindDataContext DataContext = new NorthwindDataContext();
         _Product = DataContext.Products.Where(p => p.ProductName == productName).SingleOrDefault();
      }

      return _Product;
   }
} 

 Page_Loadイベントハンドラにおいて、DetailsViewコントロールを、Productプロパティによって返されたProductオブジェクトにバインドしています。Productプロパティは、Page.RouteData.Values["ProductName"]という構文により、Page.RouteDataコレクションからURLの中の<商品名>パラメータの値を読み出します。そして、この<商品名>パラメータの値を用いたLINQクエリによって、その特定の商品に関する情報を取得します。

 以下のスクリーンショットは、動作中のViewProduct.aspxページを示したものです。ページのURLは/Products/Chaiで、ページにはチャイに関する詳細情報が表示されています(デモプログラムの他のスクリーンショットについては、記事「Using ASP.NET Routing Without ASP.NET MVC」を参照ください。この記事には、Categories/AllCategories/<カテゴリ名>の両ページのスクリーンショットが掲載されています)。

 これで終わりです。ASP.NET 4.0におけるASP.NETルーティングの設定は、以上ですべて完了しました。5つの処理が必要だったASP.NET 3.5 SP1に対し、ステップ数はわずか2つと、格段に容易になっていることが分かります。

ルーティングフレンドリなURLを生成する

 ハイパーリンクを作成したり、Response.Redirectによってユーザーをあるページから別のページへとリダイレクトしたりする場合には、ASP.NETページをその実際の名前で参照するよりも、Global.asaxに定義されたルーティングパターンを使用する方が理想的です。例えばViewProducts.aspxページには、Categories/<カテゴリ名>にリンクされた、その商品のカテゴリに含まれる全商品を一覧表示するページに戻るためのリンクがあります。<カテゴリ名>は、表示する商品を含むカテゴリの名前です。このようなルーティングフレンドリなURLを、Page.GetRouteUrlメソッドを用いて生成できます。このメソッドにはいくつかのオーバーロードメソッドがありますが、最も簡単なのは、ルートの名前とパラメータの値という2つの引数を持つものです。

 例えば、Categories/<カテゴリ名>ページに戻るための正しいURLを取得するには、以下の構文を使用します。

Page.GetRouteUrl("View Category", new { CategoryName = <カテゴリ名> }); 

 ここで、「View Category」はGlobal.asaxに定義されたルーティングルールの名前であり、<カテゴリ名>はURLの中のCategoryNameパラメータの値です。より具体的なコードを示すと、以下のようになります。

Page.GetRouteUrl("View Category", new { CategoryName = "Beverages" }); 

 Response.Redirectの新しいバージョンである、Response.RedirectToRouteという名前のメソッドも提供されています。Page.GetRouteUrlメソッドと同様に、Response.RedirectToRouteはルート名とパラメータ値を引数とし、適切な、ルーティングフレンドリなURLへとユーザーをリダイレクトします。以下に、特定の商品を紹介するページへとユーザーをリダイレクトする方法を示します。

Response.RedirectToRoute("View Product", new { ProductName = <商品名> }); 

まとめ

 ASP.NETルーティングは、.NET Frameworkにおける強力なライブラリです。開発者はこれを用いることで、アプリケーションで扱うURLを、実際の物理的なファイルから切り離すことができます。ASP.NET 3.5 SP1で導入されたASP.NETルーティングは当初、ASP.NET MVCアプリケーション向けに設計されていました。Web Formアプリケーションで使用することは可能でしたが、その設定には単調な作業の繰り返しが必要で、作成されるコードも、不要ではないかと感じるほど、重複の多いものでした。ASP.NET 4.0では、ASP.NETルーティングライブラリが強化され、より自由かつ直感的にWeb Formアプリケーションに使用できるようになりました。本稿で示したように、Global.asaxに数行のコードを記述するだけで、ルーティングパターンをASP.NETページにマップできます。特別なルートハンドラクラスを作成する必要はなくなりました。ASP.NETルーティングライブラリが裏で自動的に、ルーティングパラメータを、Pageクラスからアクセス可能なRouteDataコレクションに保存します。さらに、これらのRouteDataの値には、SqlDataSourceやObjectDataSourceといったデータソースコントロールから、宣言してアクセスできます。

 それでは、ハッピープログラミング!

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Mitchell(Scott Mitchell)

http://www.4guysfromrolla.com/ScottMitchell.shtml

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5002 2010/03/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング