2009-02-27 67 views
0

我已經在我的asp.net標記中使用了ExpressionBuilders來返回簡單的數據類型。asp.net ExpressionBuilder:可能連線一個事件?

有沒有人有任何想法如何一個ExpressionBuilder可能被用來連接事件內聯?或者ExpressionBuilders只能返回文字?

我想通過創建一個ExpressionBuilder(在我的示例中命名爲AutoBind)來連接OnLoad事件(或任何事件)。任何想法,如果這可以做到?的

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

不確定您在Expression Builders中試圖實現的目標。你不知道編譯時的事件名稱嗎? DropDownList的加載事件會改變嗎?表達建造者的選擇是什麼原因?據我所知,Expression Builders返回**文字值** – 2009-03-02 07:39:06

+0

我想這是我以後的事情。理想情況下,僅僅是聲明性地定義這個,但也許這是不可能的。我知道我可以擴展控制,但我想通過大量的控制來做到這一點。 – andleer 2009-03-02 19:29:00

回答

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

我想我明白你在這裏要做什麼,如果我錯了,請糾正我。

它看起來像你想要編寫實際的處理程序本身作爲表達式的一部分,也就是說,當Load爲下拉列表激發時,你需要調用DataBind()。

首先在此上下文中使用表達式根本不合法。表達式只能用於在控件實例上設置公共屬性 - OnLoad不是公共屬性,而是解析器從控件的公共事件中生成的事件掛鉤。

如果您在OnLoad等事件掛鉤上設置任何表達式,您將得到如下的編譯錯誤:類型'System.Web.UI.WebControls.DropDownList'沒有名爲'OnLoad'的公共屬性。

此外,表達式構建器不只是返回文字 - 他們返回表達式,因此名稱。此上下文中的表達式表示CodeDom表達式,它表示將在執行頁面時執行的代碼,作爲目標屬性分配的一部分。

例如,此的ConnectionStrings表達式:

< ASP:文字文本= 「<%$的ConnectionStrings:MyConnection的%>」/>

返回CodeDom中表達看起來像這樣在已編譯的頁面:

control.Text = ConnectionStringsExpressionBuilder.GetConnectionString(「myConnection」);