ASP .NET Web 窗体 - 为啥父级不使用数据绑定表达式调用自定义控件的属性设置器?
Posted
技术标签:
【中文标题】ASP .NET Web 窗体 - 为啥父级不使用数据绑定表达式调用自定义控件的属性设置器?【英文标题】:ASP .NET Web Forms - Why is custom control's property setter not called by parent using data binding expression?ASP .NET Web 窗体 - 为什么父级不使用数据绑定表达式调用自定义控件的属性设置器? 【发布时间】:2022-01-13 13:13:57 【问题描述】:为什么在使用data binding expressions 设置控件的属性时,我的自定义控件的属性设置器没有被父页面调用?当使用常量设置控件的属性时,设置器被调用。
MyPage.aspx:
...
<foo:MyControl ID="bar" runat="server" MyProperty="<%# Thirteen %>" />
...
MyPage.aspx.cs:
...
protected int Thirteen get; set;
protected void Page_Load(object sender, EventArgs e)
if (!IsPostBack)
Thirteen = 13;
DataBind();
...
MyControl.ascx.cs:
public partial class MyControl : System.Web.UI.UserControl
public int MyProperty
get => (int)(ViewState["MyProperty"] ?? 0);
set => ViewState["MyProperty"] = value;
我在设置器上设置了一个断点,当我加载页面时它从未被调用。
但是,如果我将 MyPage.aspx
从/更改为此,它会起作用:
<foo:MyControl ID="bar" runat="server" MyProperty="13" />
是否可以使用数据绑定表达式调用 setter?我做错了什么?
【问题讨论】:
相同的代码对我来说很好用。您确定您查看的是正确的用户控制代码文件吗? 这太尴尬了...我遗漏了一段关键的控制代码,在该代码中我重写了 OnDataBinding 而不调用它的基本实现。 【参考方案1】:尴尬...
MyControl.ascx.cs
我的实际代码如下:
public partial class MyControl : System.Web.UI.UserControl
public int MyProperty
get => (int)(ViewState["MyProperty"] ?? 0);
set => ViewState["MyProperty"] = value;
// THIS IS THE KEY
protected override void OnDataBinding(EventArgs e)
// bunch of stuff, but never calling base.OnDataBinding(e)
将base.OnDataBinding(e);
添加到被覆盖的方法后,一切正常。
【讨论】:
以上是关于ASP .NET Web 窗体 - 为啥父级不使用数据绑定表达式调用自定义控件的属性设置器?的主要内容,如果未能解决你的问题,请参考以下文章
如果父级不调用 wait(),则同一父级的两个子级不使用管道进行通信
asp.net web应用程序和asp.net web窗体应用程序的区别?