URLルーティングで独自パラメータを渡すコードを紹介します。
概要
URLルーティングでは、アクセスしたURLの一部分や全体をパラメーターとして扱うことができ、ルーティング先のページからアクセスすることができます。通常の利用では十分な機能ですが、複数のURLルーティングの先が同じページになる場合、ルーティングごとにルーティング先のページに対して独自のパラメーターを渡したい場合があります。
この記事では、URLルーティングでルーティング元からルーティング先のぺージに独自のパラメーターを渡すコードを紹介します。
実装
URLルーティングでルーティング元からルーティング先に値を渡す場合は、
DataTokens
プロパティを利用します。
プログラム例
UI
page.aspx ファイルを作成します。このページがルーティング先のページになります。
下図のUIを作成します。WebフォームにLabelコントロールを一つ配置します。
aspxファイルのコードは下記になります。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="page.aspx.cs" Inherits="AspNetRoutingParameter.page" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
コード
グローバルアプリケーションクラスのファイル(Global.asax)を追加し、下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Routing;
namespace AspNetRoutingParameter
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
protected void Session_Start(object sender, EventArgs e)
{
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
}
protected void Application_Error(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}
protected void Application_End(object sender, EventArgs e)
{
}
void RegisterRoutes(RouteCollection routes)
{
Route myRoute1 = new Route("item/{product}", null);
myRoute1.RouteHandler = new PageRouteHandler("~/page.aspx");
myRoute1.DataTokens = new RouteValueDictionary();
myRoute1.DataTokens.Add("mode", "item");
RouteTable.Routes.Add("ItemRoute", myRoute1);
Route myRoute2 = new Route("name/{product}", null);
myRoute2.RouteHandler = new PageRouteHandler("~/page.aspx");
myRoute2.DataTokens = new RouteValueDictionary();
myRoute2.DataTokens.Add("mode", "name");
RouteTable.Routes.Add("NameRoute", myRoute2);
}
}
}
Webフォームページには下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AspNetRoutingParameter
{
public partial class page : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string mode = (string)Page.RouteData.DataTokens["mode"];
string id = (string)Page.RouteData.Values["product"];
switch (mode) {
case "item":
Label1.Text = "商品コード:" + id;
break;
case "name":
Label1.Text = "商品名:" + id;
break;
}
}
}
}
解説
URLルーティングの基本処理に関しては
こちらの記事を参照してください。
パラメーターはルーティング情報の登録時に、DataTokensプロパティを設定します。
下記のコードでDataTokensプロパティが参照するRouteValueDictionary オブジェクトの作成をします。DataTokensプロパティはデフォルトではnullのため、値を格納するRouteValueDictionary オブジェクトの作成が必要です。
myRoute1.DataTokens = new RouteValueDictionary();
値の設定は下記のコードで実行します。DataTokensプロパティのAdd()メソッドを呼び出します。Addメソッドの第一引数にパラメーターのキー名を、第二引数にパラメーターの値を与えます。下記のコードでは、
mode
のキー名に対して
item
の値を設定しています。
myRoute1.DataTokens.Add("mode", "item");
ルーティング先のページ側では、ルーティング元で設定されたDataTokensプロパティの値を取得します。値の取得はDataTokensプロパティの添え字にキー名を与えることで値を取得できます。取得した値を
mode
変数に代入します。
string mode = (string)Page.RouteData.DataTokens["mode"];
ルーティング元のURLに含まれるパラメーター部分の値を取得するコードが下記のコードです。ルーティング元のURLから指定された部分を取得する方法については
こちらの記事を参照してください。
string id = (string)Page.RouteData.Values["product"];
mode
変数の値に応じてページの表示内容を変更します。
mode
変数の値が "item" の場合はページのLabelコントロールに「商品コード」の文字列とURL中に設定された商品コードを表示します。
mode
変数の値が "name" の場合は「商品名」の文字列とURL中に設定された商品名をページのLabelコントロールに表示します。
switch (mode) {
case "item":
Label1.Text = "商品コード:" + id;
break;
case "name":
Label1.Text = "商品名:" + id;
break;
}
実行結果
プロジェクトを実行します。下図の画面が表示されます。
アプリケーションルートのURLに
/item/pp-10392
を追加したURLにアクセスします。"item/{product}" のルーティングにマッチするため、modeキーの値には "item" が設定されます。ルーティング先のページでは、商品コードの表示となり、ページの画面に「商品コード:」の文字列とURLに記載されたコード名(今回の場合は "pp-10392")が表示されます。
続いて、アプリケーションルートのURLに
/name/らくだクッキー
を追加したURLにアクセスします。"name/{product}" のルーティングにマッチするため、modeキーの値には "name" が設定されます。ルーティング先のページでは、商品名の表示となり、ページの画面に「商品名:」の文字列とURLに記載された商品の名称(今回の例の場合は「らくだクッキー」)が表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-05-15
作成日: 2018-01-31