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

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

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

RouteUrl expressionはRouting用のURL設定をaspxページ内で定義されたコントロールに渡す手段を提供します。

やはりweb.configに設定が必要になってきますので、system.web/compilation要素に以下を追加します。

<expressionBuilders>
    <add expressionPrefix="RouteUrl" type="RouteUrlExpressionBuilder"/>
</expressionBuilders>

そして、新しいクラスとしてRouteUrlExpressionBuilder.csファイルを追加します。
このファイルには以下のプログラムを記述します。

using System;
using System.CodeDom;
using System.Web.UI;
using System.ComponentModel;
using System.Web.Compilation;
using System.Web.Routing;

[ExpressionPrefix("RouteUrl")]
public class RouteUrlExpressionBuilder : ExpressionBuilder
{
    public static object GetEvalData(string expression, Type target, string entry)
    {
        string[] expressionArray = expression.Split(‘=’);
        return RouteTable.Routes.GetVirtualPath(null, new RouteValueDictionary { { expressionArray[0], expressionArray[1] } }).VirtualPath;
    }

    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; }
    }
}

GetEvalDataメソッドの中身以外はExpressionBuilderクラスのサンプルプログラムそのものです。

さて、ここまでで準備は終了。
Default.aspxに以下の記述を追加して、デバッグを開始してみます。

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="<%$ RouteUrl: id=3 %>">RouteUrlテスト</asp:HyperLink>

正しくリンクが表示され、リンクをクリックすることで以下のURLに遷移できればテストも完了です。

http://localhost:(port)/RoutingTest/test/3

RouteUrl expressionを使うと、このようにaspxページ内のコントロールのプロパティにRouting用のURLを設定できます。
ただこれでできるのは静的な設定だけなので、実は直接URLを書いてしまってもいいような気がしています。

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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