【问题标题】:ASP.NET Repeater with UserControl & Postback带有用户控件和回发的 ASP.NET 中继器
【发布时间】:2013-08-30 15:45:30
【问题描述】:

我有一个带有自定义用户控件的 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的回发来维护其数据?

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        最终的工作是将计时器放在自己的更新面板中,并将计时器设置为更新面板的触发器。我找到了解决方案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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 1970-01-01
          • 2011-03-18
          相关资源
          最近更新 更多