この記事は その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