ASP .NET Web Forms — Почему родительский параметр настройки свойств пользовательского элемента управления не вызывается родительским элементом с использованием выражения привязки данных?

#asp.net #webforms

#asp.net #веб-формы

Вопрос:

Почему установщики свойств моего пользовательского элемента управления не вызываются родительской страницей при использовании выражений привязки данных для установки свойств элемента управления? Установщики вызываются при использовании константы для установки свойств элемента управления.

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" />
 

Возможно ли вызвать установщик с использованием выражения привязки данных? Что я делаю не так?

Комментарии:

1. У меня работает идентичный код. Вы уверены, что смотрите на правильный файл кода usercontrol?

2. Ну, это неловко… Я пропустил ключевую часть управляющего кода, где я переопределял 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); к переопределенному методу все работало, как ожидалось.