通用用户控件派生页面中OnTextChange/onchange JS事件无法触发的咨询
通用用户控件的事件调用解决方案
问题描述
我有一个名为CommonDate.ascx的通用用户控件,其中包含的TextBox代码如下:
<asp:TextBox ID="ChangeValue" runat="server" AutoPostBack="true"/>
该控件已在web.config中注册:
<add tagPrefix="commonusercontrol" src="~/CUC/CommonDate.ascx" tagName="CommonDate"/>
现在我在Home.ascx页面中使用该通用用户控件:
<commonusercontrol:CommonDate ID="NameTextBox" runat="server" onchange="call()"/>
这里的onchange是JS事件,我尝试在通用用户控件的派生页面中调用onchange或OnTextChanged事件但未成功,想咨询可行的实现方法。
一、实现客户端onchange事件
用户控件内部的TextBox属于封装元素,直接在外部控件标签上写onchange不会生效,需要通过以下步骤暴露客户端事件绑定能力:
- 在
CommonDate.ascx.cs中添加公共属性,用于接收客户端事件脚本:
public string ClientOnChange { get; set; }
- 在
CommonDate.ascx的Page_Load事件中,将属性值绑定到内部TextBox的客户端onchange事件:
protected void Page_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(ClientOnChange)) { ChangeValue.Attributes["onchange"] = ClientOnChange; } }
- 在
Home.ascx中使用时,通过新增属性传递JS函数:
<commonusercontrol:CommonDate ID="NameTextBox" runat="server" ClientOnChange="call()"/>
二、实现服务器端OnTextChanged事件
要让外部页面响应用户控件内部TextBox的TextChanged事件,需要在用户控件中定义自定义事件并转发内部事件:
- 在
CommonDate.ascx.cs中定义自定义事件:
public event EventHandler TextChanged;
- 给内部TextBox的
TextChanged事件添加处理方法,触发自定义事件:
protected void ChangeValue_TextChanged(object sender, EventArgs e) { TextChanged?.Invoke(this, e); }
- 在
CommonDate.ascx中给TextBox绑定服务器端事件:
<asp:TextBox ID="ChangeValue" runat="server" AutoPostBack="true" OnTextChanged="ChangeValue_TextChanged"/>
- 在
Home.ascx中绑定用户控件的自定义事件:
<commonusercontrol:CommonDate ID="NameTextBox" runat="server" OnTextChanged="NameTextBox_TextChanged"/>
- 在
Home.ascx.cs中实现事件处理逻辑:
protected void NameTextBox_TextChanged(object sender, EventArgs e) { // 编写你的业务处理代码 }
内容的提问来源于stack exchange,提问作者bloo
相关产品推荐
相关产品推荐

