0

我有一个带有自定义用户控件的 ASP.NET 中继器,定义如下:

<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 的回发来维护其数据?

4

3 回答 3

1

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

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;
}
于 2013-08-30T16:35:32.880 回答
1

在您的 OnInit 方法中,如果您将List<someObject>检索到的内容保存到 ViewState 并绑定它会发生什么?这样,当您的 Timer Ticks 时,如果您没有新数据,您只需重新绑定到 ViewState 中存储的数据。

于 2013-08-30T16:45:51.653 回答
0

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

ASP.NET 没有将我的对象存储在会话信息中,即使我在其中EnableViewState一个或. 为了解决这个问题,我稍微改变了我的财产ViewStateModeEnabledTrue

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

Page_Load然后我可以通过将对象拉出数据库(使用保存的ViewStateID)来拉回用户控件中的真实对象。

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

  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>
于 2013-08-30T19:22:09.663 回答