我在asp.net标记中使用了ExpressionBuilders来返回简单的数据类型。
有没有人知道如何使用ExpressionBuilder来连接内联事件?或者ExpressionBuilders只能返回文字?
我想通过创建一个ExpressionBuilder (在我的示例中名为AutoBind )来连接OnLoad事件(或任何事件)。如果可以这样做,有什么想法吗?
<asp:DropDownList ID="DropDownList1" runat="server"
DataSource='<%# GetRecords() %>'
DataTextField="Name" DataValueField="ID"
OnLoad="<%$ AutoBind: this.DataBind() %>" />发布于 2009-03-05 18:17:01
萨姆是对的。表达式只能在属性上设置,它不会连接事件。我通过使用表达式构建器实现了"close“。
[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(); });发布于 2009-03-02 13:55:43
除了使用表达式生成器,您还可以调用代码中定义的任何事件方法,该方法具有事件处理程序所需的签名
在事件处理事件参数中,您可以标识对象和数据,并根据需要操作控件
发布于 2009-03-05 00:11:17
我想我明白你想做什么了,如果我错了,请纠正我。
看起来您想要将实际的处理程序本身编码为表达式的一部分,即,当Load为下拉列表触发时,您希望调用DataBind()。
首先,在这个上下文中使用表达式是不合法的。表达式只能用于在控件实例上设置公共属性- OnLoad不是公共属性,而是分析器从控件的公共事件生成的事件挂钩。
如果你在事件钩子上设置任何表达式,比如OnLoad,你会得到如下的编译错误:类型'System.Web.UI.WebControls.DropDownList‘没有名为'OnLoad’的公共属性。
此外,表达式构建器不仅返回文字-它们返回表达式,因此得名。此上下文中的表达式是指CodeDom表达式,该表达式表示在执行页面时将执行的代码,作为目标属性赋值的一部分。
例如,此ConnectionStrings表达式:
https://stackoverflow.com/questions/596107
复制相似问题