Почему элемент управления ASP.Net Web Forms должен вызывать свою собственную DataBind для получения привязок, определенных в разметке его родителя? - PullRequest
0 голосов
/ 24 мая 2019

Вкратце, я работаю над приложением, которое использует ASP.Net Web Forms.

Имеет страницу aspx, которая включает выражение привязки данных для привязки одного из общедоступных свойств страницы к свойству пользовательского элемента управления. Реальная страница довольно сложная, но я смог продублировать поведение на очень простом примере.

Page.aspx:

<uc:CustomControl runat="server" Text='<%# Text %>' />

В переопределении OnInit страницы он вызывает метод DataBind страницы.

Page.aspx.cs:

protected override void OnInit(EventArgs e)
{
  DataBind();
  base.OnInit(e);
}

Проблема заключается в том, что свойство Text пользовательского дочернего элемента управления остается нулевым, пока этот элемент управления не вызовет base.DataBind ().

UserControl.ascx.cs:

public string Text { get; set; }

public override void DataBind()
{
  // Text is null at this point
  base.Databind();
  // Text is populated at this point
}

Но выражение привязки данных, которое связывает это текстовое свойство со свойством Text дочернего элемента управления, находится в родительской разметке . С какой стати метод DataBind дочернего элемента управления должен быть вызван до присвоения значения?

Это ужасно неудобно, потому что оно не позволяет передавать данные со страницы на произвольную глубину во время привязки данных. Чтобы получить доступ к значению привязки данных из разметки родителя, дочерний элемент управления страницы должен вызвать base.DataBind, но это приводит к тому, что его дочерние элементы управления получают привязку к данным, даже если у него не было времени заполнить данные этих потомков.

Как данные должны передаваться от родителя к потомку во время привязки данных, если данные связаны в обратном порядке? Чего мне не хватает?

1 Ответ

0 голосов
/ 03 июня 2019

Похоже, нет хорошего ответа на этот вопрос, но я нашел решение своей проблемы, посмотрев на справочный источник. Есть еще один виртуальный метод, который вы можете переопределить, который называется DataBindChildren. Он вызывается после того, как выражения привязки данных родителя были оценены и привязаны к элементу управления, поэтому любые данные, которые вы хотите передать дочерним элементам до их привязки, могут быть переданы в этот момент.

...