Пользовательский элемент управления ASP.NET: Page_Load запускается до установки свойства

Это сводит меня с ума.

У меня очень простой пользовательский элемент управления:

public int? ImageId {set; get;}

protected void Page_Load(object sender, EventArgs e)
{
     ... do something with ImageId...
}

Затем я помещаю этот элемент управления на страницу с ListView в UpdatePanel:

<asp:ListView ID="ListViewImages"  runat="server" DataSourceID="src">
  <LayoutTemplate>
    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
  </LayoutTemplate>
  <ItemTemplate>
    <My:MyControl ImageId='<%# Eval("Id") %>' ID="cipPreview" runat="server"  />
  </ItemTemplate>
</asp:ListView>

Проблема в том, что Page_Load срабатывает ДО того, как ASP.NET устанавливает ImageId. С помощью отладчика я узнал, что по какой-то причине ImageId в MyControl IS SET, но это происходит только после завершения обработки Page_Load. Что случилось?


person Sergey Kovalev    schedule 05.09.2009    source источник


Ответы (1)


Вероятно, это связано с тем, что привязка данных к ListView происходит ПОСЛЕ срабатывания Page_Load, поэтому ваше свойство не установлено в этот момент. Вы можете переместить свой код в событие PreRender, поскольку оно вызывается после завершения привязки данных.

Дополнительная информация согласно MSDN:

PreRender - до того, как это событие произойдет:

  • Объект Page вызывает EnsureChildControls для каждого элемента управления и для страницы.
  • Каждый элемент управления с привязкой к данным, для которого установлено свойство DataSourceID, вызывает свой метод DataBind.
person patmortech    schedule 05.09.2009