ASP.NET用户控件:Page_Load在设置属性之前触发

Ser*_*lev 10 c# asp.net properties pageload

这真让我抓狂.

我有一个非常简单的用户控件:

public int? ImageId {set; get;}

protected void Page_Load(object sender, EventArgs e)
{
     ... do something with ImageId...
}
Run Code Online (Sandbox Code Playgroud)

然后我将此控件放在UpdatePanel中的ListView页面上:

<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>
Run Code Online (Sandbox Code Playgroud)

问题是Page_Load在ASP.NET设置ImageId之前触发.在调试器的帮助下,我发现由于某种原因,MyControl中的ImageId是SET,但只有在Page_Load完成处理后才会发生.怎么了?

pat*_*ech 10

这可能是因为ListView上的数据绑定在Page_Load触发后发生,因此您的属性在此时未设置.您可以将代码移动到PreRender事件,因为它在数据绑定完成后调用.

更多信息根据MSDN:

PreRender - 在此事件发生之前:

  • Page对象为每个控件和页面调用EnsureChildControls.
  • 设置了DataSourceID属性的每个数据绑定控件都调用其DataBind方法.