带有UserControl的ASP.NET中继器&;Postback

本文关键字:amp Postback 中继器 NET UserControl ASP 带有 | 更新日期: 2023-09-27 18:29:44

我有一个ASP.NET Repeater,它具有如下定义的自定义用户控件:

<asp:Repeater ID="feedCards" runat="server">
  <ItemTemplate>
    <vsan:card ID="card" VFeed='<%# Container.DataItem %>' runat="server" />
  </ItemTemplate>
</asp:Repeater>

中继器在OnInit后面的代码中进行数据绑定,采用标准方法:

List<someObject> data = ...;
feedCards.DataSource = data;
feedCards.DataBind();

在我介绍需要定期更新页面上的数据之前,这项工作一直很好。页面上有一个asp:Timer,每30秒触发一次。当计时器启动时,它会检查一些服务器端数据,并在必要时更新页面。

问题是,当计时器启动时,我会丢失每个中继器卡中的所有数据。将显示正确的卡数,但其中没有数据。

有没有一种方法可以让用户控件通过asp.net的回发来维护其数据?

带有UserControl的ASP.NET中继器&;Postback

如果我正确理解你的问题,数据是有界的,但不会出现在你的中继器中,对吗?所以这个代码可能会帮助你解决它:

protected void yourRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    MyDataBoundedObject bounded = (MyDataBoundedObject)e.Item.DataItem;
    Label lbText = (Label)e.Item.FindControl("myText");
    lbText.Text = bounded.myText;
}

在OnInit方法中,如果将检索到的List<someObject>保存到ViewState并绑定它,会发生什么?这样,当你的计时器滴答作响时,如果你没有新数据,你只需重新绑定到ViewState中存储的数据。

我必须克服几个问题,以下是我最终要做的:

ASP.NET没有在会话信息中存储我的对象,即使我在EnabledTrue中有EnableViewStateViewStateMode。为了解决这个问题,我稍微改变了我的房产

object realObj = null;
public object VFeed
{
   get { return realObj; }
   set
   {
      realObj = value;
      ViewState["objectID"] = realObj.ID;
   }
}

然后,我可以通过从数据库中提取对象(使用保存的ViewState ID)来提取用户控件的Page_Load中的真实对象。

然后我的计时器的实现方式出现了问题。我尝试了几种方法:

  1. 只是把计时器放在页面上,不包含在任何类型的更新面板中,等等。
    • 这在整个页面刷新时不起作用,我的所有用户控件也不起作用
  2. 将计时器设置为包含我的项目列表的更新面板的触发器
    • 这样做效果更好,因为只刷新了页面的那一部分,但在这种情况下,这还不够
    • 我不希望我所有的花哨的用户控件每30秒闪烁一次

最终起作用的是将计时器放在自己的更新面板中,并将计时器设置为更新面板的触发器。我在这里找到了解决方案,这是代码

<asp:UpdatePanel runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false"
    ID="upTimer">
    <ContentTemplate>
        <asp:Timer ID="GameClock" runat="server" Interval="5000" Enabled="true" OnTick="GameClock_Tick">
        </asp:Timer>
    </ContentTemplate>
</asp:UpdatePanel>