ホーム > .NET, ASP.NET 備忘録 > ちょっと先取り Routing 4:その5 RouteParameter

ちょっと先取り Routing 4:その5 RouteParameter

この記事は その1 その2 その3 その4 の記事を見ていることを前提にしています。

RouteParameterを用意すると、DataSource等のコントロールにそのままパラメータとしてRouteDataを渡すことができるようになります。

ここでもweb.configの修正はあるのですが、その前にRouteParameter.csファイルを追加します。
このファイルに以下のプログラムを記述します。

namespace Samples.Routing
{
    using System;
    using System.Web;
    using System.Web.Routing;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;

    public class RouteParameter : Parameter
    {
        public RouteParameter()
        {
        }

        public RouteParameter(string name, string routekey)
            : base(name)
        {
            this.RouteKey = routekey;
        }

        public RouteParameter(string name, DbType dbtype, string routekey)
            : base(name, dbtype)
        {
            this.RouteKey = routekey;
        }

        public RouteParameter(string name, TypeCode type, string routekey)
            : base(name, type)
        {
            this.RouteKey = routekey;
        }

        protected RouteParameter(RouteParameter original)
            : base(original)
        {
            this.RouteKey = original.RouteKey;
        }

        protected override Parameter Clone()
        {
            return new RouteParameter(this);
        }

        public string RouteKey
        {
            get
            {
                object o = base.ViewState["RouteKey"];
                if (o == null)
                    return String.Empty;
                return (string)o;
            }
            set
            {
                base.ViewState["RouteKey"] = value;
                base.OnParameterChanged();
            }
        }

        protected override object Evaluate(HttpContext context, Control control)
        {
            if ((context != null) && (context.Request != null))
            {
                var r = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
                return r != null ? r.Values[this.RouteKey].ToString() : string.Empty;
            }
            return null;
        }

    }
}

このプログラムを記述するにあたっては、QueryStringParameterクラスの実装を参考にしました。
次にweb.configのsystem.web/pages/controls要素に以下の通りに追加します。

<add tagPrefix="asp" namespace="Samples.Routing" />

実はRouteParameter.csのプログラム中でnamespaceを設定しているのが重要な点です。
web.conifgにtagPrefixの設定をする場合、Webサイトプロジェクトに追加したクラスならnamespaceさえ記述してあればこんなに簡単にtagPrefixの設定ができます。
この設定を行うことで、まるで元から用意されているコントロールのように、<asp: というタグを使えるようになります。

さて、ここまでで準備は終了。
適当なデータを用意し、Default2.aspxに以下のようにGridViewとSqlDataSourceを追加して動作を確認してみましょう。

    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" />
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Table1] WHERE ([ID] = @ID)">
        <SelectParameters>
            <asp:RouteParameter Name="ID" RouteKey="id" />
        </SelectParameters>
    </asp:SqlDataSource>

これでURLに対応したIDのデータのみが選択されて表示されればテストは終了です。

実はRouteParameterのかわりにRouteValue expressionを使っても同じことはできます。

<asp:Parameter Name="ID" DefaultValue="<%$ RouteValue : id %>" />

こんな感じで使えばいいですね。
まぁ、せっかく用意したRouteParameterなので、使えるところはこっちを使うほうがいい、、、のかな(w

カテゴリー:.NET, ASP.NET 備忘録
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。