URLルーティングで独自パラメータを渡す - C#

URLルーティングで独自パラメータを渡すコードを紹介します。

概要

URLルーティングでは、アクセスしたURLの一部分や全体をパラメーターとして扱うことができ、ルーティング先のページからアクセスすることができます。通常の利用では十分な機能ですが、複数のURLルーティングの先が同じページになる場合、ルーティングごとにルーティング先のページに対して独自のパラメーターを渡したい場合があります。
この記事では、URLルーティングでルーティング元からルーティング先のぺージに独自のパラメーターを渡すコードを紹介します。

実装

URLルーティングでルーティング元からルーティング先に値を渡す場合は、DataTokensプロパティを利用します。

プログラム例

UI

page.aspx ファイルを作成します。このページがルーティング先のページになります。
下図のUIを作成します。WebフォームにLabelコントロールを一つ配置します。


aspxファイルのコードは下記になります。
page.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)を追加し、下記のコードを記述します。
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フォームページには下記のコードを記述します。
page.aspx.cs
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
iPentec all rights reserverd.