我有一个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的回发来维护其数据?
答案 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没有将我的对象存储在会话信息中,即使我EnableViewState
或ViewStateMode
有Enabled
和True
。为了解决这个问题,我稍微改变了我的财产
object realObj = null;
public object VFeed
{
get { return realObj; }
set
{
realObj = value;
ViewState["objectID"] = realObj.ID;
}
}
然后我可以通过将对象拉回数据库(使用保存的Page_Load
ID)来撤回用户控件的ViewState
中的真实对象。
然后我的计时器实现方式出现问题。我尝试了几件事:
最终工作的是将计时器放在自己的更新面板中,并将计时器设置为更新面板的触发器。我找到了解决方案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>