この記事は その1 その2 その3 の記事を見ていることを前提にしています。
その3の記事とほとんど同じように見えるので、どこが違うのか注意して読んでください。
RouteValue expressionはRouteDataをaspxページ内で定義されたコントロールに渡す手段を提供します。
web.configのsystem.web/compilation/expressionBuilders要素に以下を追加します。
<add expressionPrefix="RouteValue" type="RouteValueExpressionBuilder"/>
そして、新しいクラスとしてRouteValueExpressionBuilder.csファイルを追加します。
このファイルには以下のプログラムを記述します。
using System;
using System.CodeDom;
using System.ComponentModel;
using System.Web;
using System.Web.Compilation;
using System.Web.Routing;
using System.Web.UI;
[ExpressionPrefix("RouteValue")]
public class RouteValueExpressionBuilder : ExpressionBuilder
{
public static object GetEvalData(string expression, Type target, string entry)
{
var r = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
return r != null ? r.Values[expression].ToString() : string.Empty;
}
public override object EvaluateExpression(object target, BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
return GetEvalData(entry.Expression, target.GetType(), entry.Name);
}
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
Type type1 = entry.DeclaringType;
PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
CodeExpression[] expressionArray1 = new CodeExpression[3];
expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim());
expressionArray1[1] = new CodeTypeOfExpression(type1);
expressionArray1[2] = new CodePrimitiveExpression(entry.Name);
return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "GetEvalData", expressionArray1));
}
public override bool SupportsEvaluate
{
get { return true; }
}
}
RouteUrlExpressionBuilderと同じく、GetEvalDataメソッドの中身以外はExpressionBuilderクラスのサンプルプログラムそのものです。
さて、ここまでで準備は終了。
Default2.aspxに以下の記述を追加して、デバッグを開始してみます。
<asp:Label ID="Label2" runat="server" Text="<%$ RouteValue : id %>" />
Default.aspxにはその3で試したリンクが表示されるので、そのリンクをクリックして以下のURLに遷移します。
http://localhost:(port)/RoutingTest/test/3
このとき、上で追加したLabel2に"3"が表示されればテストは終了です。
RouteValue expressionを使うと、このようにaspxページ内のコントロールのプロパティにRouteDataを直接設定できます。
DataSourceコントロールとともにRouteValue expressionを利用すると、コードを記述することなくURLに合わせたデータを表示することができるようになります。