"$RouteUrl"を利用して URLルーティングのURLを生成する手順を紹介します。
概要
ASP.NETでURLルーティングを利用する場合、単純にURLをハードコーディングするとうまく動作しないなどの不具合が発生する場合があります。(うまく動かない動作の詳細については
こちらの記事を参照してください。)
この記事では、"~"演算子を利用してURLルーティングのURLを生成する手順を紹介します。
HyperLinkコントロールなどのASP.NETコントロールを利用している場合は、NavigateUrlに"$RouteUrl"を記述することでURLの生成ができます。
書式
HyperLinkコントロールのNavigateUrlに下記の書式で記述します。
<%$RouteUrl:(パラメーター名1)=(パラメーター名1の値),(パラメーター名2)=(パラメーター名2の値),....., routename=(ルーティング名) %>
[ルーティング名]はGlobal.asaxファイルで
RouteTable.Routes
に追加する際に指定するルーティングの名称です。
注意
$RouteUrl: を利用する場合はaspxファイルに下記のImport コードが必要になります。このコードがないと、$RouteUrl:はエラーとなりプロジェクトのビルドができません。
<%@ Import Namespace="System.Web.Routing" %>
プログラム例
先のプログラムに下記の HandleRouteUrl.aspx ファイルを追加します。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HandleRouteUrl.aspx.cs" Inherits="AspNetRoutingCreateLink.HandleRouteUrl" %>
<%@ Import Namespace="System.Web.Routing" %>
<!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><br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="<%$RouteUrl:action=jump,target=penguin,routename=MyRoute01 %>">HyperLink</asp:HyperLink>
</div>
</form>
</body>
</html>
デザイナ画面では下図になります。
コード部に下記コードを実装します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AspNetRoutingCreateLink
{
public partial class HandleRouteUrl : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string act = (string)Page.RouteData.Values["action"];
string tgt = (string)Page.RouteData.Values["target"];
Label1.Text = act;
Label2.Text = tgt;
}
}
}
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 AspNetRoutingCreateLink
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteValueDictionary default_dic = new RouteValueDictionary();
default_dic.Add("action", "run");
default_dic.Add("target", "duck");
RouteTable.Routes.MapPageRoute("MyRoute01", "{action}/{target}", "~/HandleRouteUrl.aspx", true, default_dic);
}
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)
{
}
}
}
解説
Global.asaxでRoutesに設定したルーティングは下記のコードです。ルーティング名は"MyRoute01"であり、action, target の2つのパラメータがあります。
RouteValueDictionary default_dic = new RouteValueDictionary();
default_dic.Add("action", "run");
default_dic.Add("target", "duck");
RouteTable.Routes.MapPageRoute("MyRoute01", "{action}/{target}", "~/HandleRouteUrl.aspx", true, default_dic);
HyperLinkの記述は下記のコードとなり、リンク先のURLを
$RouteUrl
で生成します。action, targetのパラメータの値を設定し、routenameにルーティングの名称
MyRoute01
を指定します。
この記述により、
MyRoute01
のルーティングURLの形式に従って、与えられたパラメーターを持つURLが生成されます。
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="<%$RouteUrl:action=jump,target=penguin,routename=MyRoute01 %>">HyperLink</asp:HyperLink>
実行結果
プロジェクトを実行します。Webブラウザが表示されますので、
http://localhost:51998/MyApps/walk/camel/
のURLにアクセスします。下図の画面が表示されます。
[HyperLink]のリンク先を確認すると
http://localhost:51998/MyApps/jump/penguin
となっており、正しいリンク先URLが生成されています。
トレイリングスラッシュがついたURL
http://localhost:51998/MyApps/walk/camel/
にアクセスします。下図の画面が表示されます。
[HyperLink]のリンク先を確認すると、トレイリングスラッシュがない場合と同じURLが遷移先になっており、正しいURLが生成されていることが確認できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2018-02-26