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

发布于 2024-08-03 21:11:09 字数 740 浏览 8 评论 0原文

这让我发疯。

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

public int? ImageId {set; get;}

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

然后我将此控件放在 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>

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

This is driving me crazy.

I have a very simple user control:

public int? ImageId {set; get;}

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

And then I put this control on the page with ListView within 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>

The problem is Page_Load fires BEFORE ASP.NET sets ImageId. With debugger's help I found out that for some reason ImageId in MyControl IS SET, but it happens only after Page_Load has finished processing. What's wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隱形的亼 2024-08-10 21:11:09

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

更多信息参见 MSDN

- 在此事件发生之前:

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

It's probably because data binding on the ListView happens AFTER Page_Load fires, so therefore your property isn't set at that point. You could move your code to PreRender event since it is called after data binding is completed.

More info according to MSDN:

PreRender -- Before this event occurs:

  • The Page object calls EnsureChildControls for each control and for the page.
  • Each data bound control whose DataSourceID property is set calls its DataBind method.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文