2009-02-27 73 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”);