asp.net ExpressionBuilder:可以连接事件吗?

时间:2009-02-27 18:54:03

标签: c# asp.net

我已经在我的asp.net标记中使用了ExpressionBuilders来返回简单的数据类型。

有没有人有任何想法如何使用ExpressionBuilder来连接内联事件?或者ExpressionBuilders只能返回文字吗?

我想通过创建一个ExpressionBuilder(在我的示例中名为AutoBind)来连接OnLoad事件(或任何事件)。如果可以的话,有什么想法吗?

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

3 个答案:

答案 0 :(得分: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(); });

答案 1 :(得分:0)

而不是使用表达式构建器,您可以调用代码中定义的任何事件方法,该方法具有事件处理程序的reuqired签名

在事件句柄事件参数中,您可以根据需要识别对象和数据并操纵控件

答案 2 :(得分:0)

我想我明白你要在这里做什么,如果我错了就纠正我。

看起来您希望将实际处理程序本身编码为表达式的一部分,即,当Load为下拉列表触发时,您希望调用DataBind()。

首先在这种情况下使用表达式根本不合法。表达式只能用于在控件实例上设置公共属性 - OnLoad不是公共属性,而是解析器从控件的公共事件中生成的事件挂钩。

如果在事件挂钩(如OnLoad)上设置任何表达式,则会出现如下编译错误:类型“System.Web.UI.WebControls.DropDownList”没有名为“OnLoad”的公共属性。

此外,表达式构建器不仅返回文字 - 它们返回表达式,因此返回名称。此上下文中的表达式表示CodeDom表达式,该表达式表示将在执行页面时执行的代码,作为目标属性赋值的一部分。

例如,此ConnectionStrings表达式:

&lt; asp:Literal Text =“&lt;%$ ConnectionStrings:myConnection%&gt;” /&GT;

返回一个在编译页面中如下所示的CodeDom表达式:

control.Text = ConnectionStringsExpressionBuilder.GetConnectionString(“myConnection”);