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窗体应用程序的区别?

如何在 ASP.NET Web 窗体环境中使用 DLL?

带有 Web 窗体的 ASP.NET 路由

RelativeLayout 中的 ImageView 与父级不匹配

ASP.NET Web 窗体和 ASP.NET 网页