2013-08-30 2 views
0

У меня есть ASP.NET Repeater с элементом управления пользовательского пользователя определяется следующим образом:ASP.NET повторитель с UserControl & Postback

<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(); 

Это работает нормально, пока я не введу необходимость периодического обновления данных на странице. На странице, которая срабатывает каждые 30 секунд, есть asp:Timer. Когда таймер срабатывает, он проверяет некоторые данные на стороне сервера, при необходимости обновляет страницу.

Проблема в том, что когда срабатывает таймер, я теряю все данные на каждой из карт ретранслятора. Отображается правильное количество карт, но в них нет данных.

Есть ли способ, чтобы пользовательский контроль сохранял свои данные через postback asp.net?

ответ

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 пользовательского элемента управления, потянув объект обратно из базы данных (с использованием сохраненного ViewState ID).

Тогда возникла проблема с тем, как мой таймер был реализован. Я попробовал несколько вещей:

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

В вашем методе OnInit, что произойдет, если вы сохраните List<someObject> вы извлекаете в ViewState, а также связывание его? Таким образом, когда ваш Timer Ticks, если у вас нет новых данных, вы просто переписываете сохраненные данные в ViewState.

Смежные вопросы