首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asp.net ExpressionBuilder:可以连接一个事件吗?

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

Stack Overflow用户
提问于 2009-02-27 18:54:03
回答 3查看 698关注 0票数 0

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

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

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

代码语言:javascript
复制
<asp:DropDownList ID="DropDownList1" runat="server"
    DataSource='<%# GetRecords() %>'
    DataTextField="Name" DataValueField="ID"
    OnLoad="<%$ AutoBind: this.DataBind() %>" />
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-05 18:17:01

萨姆是对的。表达式只能在属性上设置,它不会连接事件。我通过使用表达式构建器实现了"close“。

代码语言:javascript
复制
[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);
        }
    }

在页面的标记中,你会写下这样的东西...

代码语言:javascript
复制
<asp:DropDownList runat="server" onload='<%$ Delegate:(o,e) => { this.DataBind(); } %>' />

问题是编译器会生成这样的代码。

代码语言:javascript
复制
 ((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("onload", System.Convert.ToString(new System.EventHandler((o,e) => { this.DataBind(); }), System.Globalization.CultureInfo.CurrentCulture));

它本质上是将委托“转换”成一个字符串,实际上你希望编译器这样做……

代码语言:javascript
复制
@__ctrl.Load += new System.EventHandler((o,e) => { this.DataBind(); });
票数 2
EN

Stack Overflow用户

发布于 2009-03-02 13:55:43

除了使用表达式生成器,您还可以调用代码中定义的任何事件方法,该方法具有事件处理程序所需的签名

在事件处理事件参数中,您可以标识对象和数据,并根据需要操作控件

票数 0
EN

Stack Overflow用户

发布于 2009-03-05 00:11:17

我想我明白你想做什么了,如果我错了,请纠正我。

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

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

如果你在事件钩子上设置任何表达式,比如OnLoad,你会得到如下的编译错误:类型'System.Web.UI.WebControls.DropDownList‘没有名为'OnLoad’的公共属性。

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

例如,此ConnectionStrings表达式:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/596107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档