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

ちょっと先取り Routing 4:その4 RouteValue expression

この記事は その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に合わせたデータを表示することができるようになります。

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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