带有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的回发来维护其数据?
如果我正确理解你的问题,数据是有界的,但不会出现在你的中继器中,对吗?所以这个代码可能会帮助你解决它:
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没有在会话信息中存储我的对象,即使我在Enabled
或True
中有EnableViewState
和ViewStateMode
。为了解决这个问题,我稍微改变了我的房产
object realObj = null;
public object VFeed
{
get { return realObj; }
set
{
realObj = value;
ViewState["objectID"] = realObj.ID;
}
}
然后,我可以通过从数据库中提取对象(使用保存的ViewState
ID)来提取用户控件的Page_Load
中的真实对象。
然后我的计时器的实现方式出现了问题。我尝试了几种方法:
- 只是把计时器放在页面上,不包含在任何类型的更新面板中,等等。
- 这在整个页面刷新时不起作用,我的所有用户控件也不起作用
- 将计时器设置为包含我的项目列表的更新面板的触发器
- 这样做效果更好,因为只刷新了页面的那一部分,但在这种情况下,这还不够
- 我不希望我所有的花哨的用户控件每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>