"~"演算子を利用して URLルーティングのURLを生成する - ASP.NET

"~"演算子を利用して URLルーティングのURLを生成する方法を紹介します。

概要

ASP.NETでURLルーティングを利用する場合、単純にURLをハードコーディングするとうまく動作しないなどの不具合が発生する場合があります。(うまく動かない動作の詳細についてはこちらの記事を参照してください。)
この記事では、"~"演算子を利用してURLルーティングのURLを生成する手順を紹介します。

手順

HyperLinkコントロールなどのASP.NETコントロールを利用している場合は、URLに"~"を記述することでこの現象を回避できます。

プログラム例

先のプログラムを下記に変更します。
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 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}", "~/HandleHyperLink.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)
    {

    }
  }
}
HandlerHyperLink.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HandleHyperLink.aspx.cs" Inherits="AspNetRoutingCreateLink.HandleHyperLink" %>

<!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="~/swim/penguin">HyperLink</asp:HyperLink>
        </div>
    </form>
</body>
</html>
デザイナ画面では下図になります。

HandlerHyperLink.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Routing;

namespace AspNetRoutingCreateLink
{
  public partial class HandleHyperLink : 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;
    }
  }
}

解説

NavigateUrlに"~"を記述することでアプリケーションのルートディレクトリからの相対ディレクトリでパスを記述できます。

実行結果

上記のプロジェクトを実行します。Webブラウザが起動しますので、
http://localhost:51998/MyApps/jump/duck
のURLに遷移します。下図の画面が表示され、ActionとTargetの要素が取得できLabelに表示されています。また、リンクの遷移先は
http://localhost:51998/MyApps/swim/penguin
のURLになっており、正しいURLが遷移先になっています。


トレイリングスラッシュのあるURLである
http://localhost:51998/MyApps/walk/camel/
にアクセスした場合でもリンク先は、先のURLと同じURLであり、正しい遷移先になっています。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2018-02-26
iPentec all rights reserverd.