2009-02-27 4 views
0

シンプルなデータ型を返すために、asp.netのマークアップ内にExpressionBuildersを使用しています。asp.net ExpressionBuilder:イベントを配線することはできますか?

ExpressionBuilderを使用してイベントをインラインで結ぶ方法はありますか? ExpressionBuilderはリテラルだけを返すことができますか?

ExpressionBuilder(私の例ではAutoBindという名前)を作成して、OnLoadイベント(または任意のイベント)を接続したいと考えています。これができればどんなアイデアですか?

<asp:DropDownList ID="DropDownList1" runat="server" 
    DataSource='<%# GetRecords() %>' 
    DataTextField="Name" DataValueField="ID" 
    OnLoad="<%$ AutoBind: this.DataBind() %>" /> 
+0

ここでExpression Builderで達成しようとしていることについては不明です。コンパイル時にイベントの名前を知らないのですか? DropDownListのLoadイベントは変更されますか?表現ビルダーのためのあなたの理由は何ですか?私の知る限りでは、表現ビルダーは**リテラル値**を返します** –

+0

私はこれが私の後だったと思います。理想的にはこれを宣言的に定義するだけですが、これは不可能かもしれません。私はコントロールを拡張することができますが、私は多数のコントロールでこれをやりたかったのです。 – andleer

答えて

2

サムが正しい。式はプロパティでのみ設定でき、イベントは配線されません。私は式ビルダーでこれを行うことで "近い"ことができました。あなたはこのような何かを記述したページのマークで

[System.Web.Compilation.ExpressionPrefix("Delegate")] 
    public class DelegateExpressionBuilder : ExpressionBuilder 
    { 
     public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
     {   

     return new CodeDelegateCreateExpression(new CodeTypeReference("System.EventHandler"), null, entry.Expression); 
     } 
    } 

...

<asp:DropDownList runat="server" onload='<%$ Delegate:(o,e) => { this.DataBind(); } %>' /> 

問題は、コンパイラがこれを生成することです。

((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("onload", System.Convert.ToString(new System.EventHandler((o,e) => { this.DataBind(); }), System.Globalization.CultureInfo.CurrentCulture)); 

実際にはデリゲートを文字列に「変換」して、コンパイラがこれを行うようにしています...

@__ctrl.Load += new System.EventHandler((o,e) => { this.DataBind(); }); 
0

の代わりに、式ビルダを使用して、あなたは、オブジェクトとデータを識別できるイベントハンドルのイベント引数にイベントハンドラ

のreuqired署名を持っているあなたのコード内で定義されたイベントメソッドのいずれかとを呼び出すことができます

+0

確かに、ここでの考え方は可能ならばマークアップでこれを行うことです。 – andleer

0

あなたがここでやろうとしていることを理解していると思いますが、間違っていれば私を修正してください。

実際のハンドラ自体を式の一部としてコーディングしたい、つまりドロップダウンリストのLoadが呼び出されたときに、DataBind()を呼び出すように見えます。

まず、この文脈で式を使用するのは正当ではありません。式は、コントロールインスタンスのパブリックプロパティの設定にのみ使用できます.OnLoadはパブリックプロパティではなく、コントロールのパブリックイベントからパーザによって生成されたイベントフックです。

OnLoadなどのイベントフックで式を設定すると、次のようなコンパイルエラーが発生します。 'System.Web.UI.WebControls.DropDownList'型に 'OnLoad'という名前のパブリックプロパティがありません。

また、式ビルダーはリテラルを返すだけでなく、式も返します。このコンテキストでの式は、ターゲットプロパティの割り当ての一部として、ページの実行時に実行されるコードを表すCodeDom式を意味します。例えば

、こののconnectionStrings式:

< ASP:リテラルテキスト= "<%の$ののconnectionStrings:MyConnectionと%>" />

は、コンパイル済みのページに次のようになりたCodeDOM式を返します。

control.Text = ConnectionStringsExpressionBuilder.GetConnectionString( "myConnection");