我已经在我的asp.net标记中使用了ExpressionBuilders来返回简单的数据类型。
有没有人有任何想法如何使用ExpressionBuilder来连接内联事件?或者ExpressionBuilders只能返回文字吗?
我想通过创建一个ExpressionBuilder(在我的示例中名为AutoBind)来连接OnLoad事件(或任何事件)。如果可以的话,有什么想法吗?
<asp:DropDownList ID="DropDownList1" runat="server"
DataSource='<%# GetRecords() %>'
DataTextField="Name" DataValueField="ID"
OnLoad="<%$ AutoBind: this.DataBind() %>" />
答案 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”);