带有UserControl的ASP.NET Repeater&回传

时间:2013-08-30 15:45:30

标签: c# asp.net data-binding postback

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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

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

  1. 只需将计时器放在页面上,不包含在任何类型的更新面板中等。
    • 当整个页面刷新时,这不起作用,我的所有用户控件也是如此
  2. 将计时器设置为包含项目列表的更新面板的触发器
    • 效果更好 - 因为只有页面的那一部分刷新,但在这种情况下还不够
    • 我不希望我的所有花哨的用户控件每隔30秒闪烁一次。
  3. 最终工作的是将计时器放在自己的更新面板中,并将计时器设置为更新面板的触发器。我找到了解决方案here,这是代码

    <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>