2012-03-28 2 views
4

В моем .ascx управления:asp.net повторитель данных после постбэка

<asp:Repeater ID="rptProducts" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="lblProductName" runat="server"> 
      <%# Eval("Name") %> 
     </asp:Label> 
    </ItemTemplate> 
</asp:Repeater> 

<asp:Button ID="btnGo" runat="server" Text="Postback" onclick="btnGo_Click" /> 

А в коде:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!this.IsPostBack){ 
     var products = (from p in context.Products 
         select p).Take(30); 

     rptProducts.DataSource = products; 
     rptProducts.DataBind(); 
    } 
} 

И я задаюсь вопросом, почему мой ретранслятор теряет свои данные после того, как я нажимаю, что (после обратной связи)

+2

Не должно быть. Что происходит внутри 'btnGo_Click'? – mellamokb

+0

Что значит «ретранслятор теряет свои данные». Это не так, что означает, что все элементы управления уничтожены? Вы пытаетесь получить доступ к значениям повторителя в событии нажатия кнопки? – David

+0

В событии кнопки я ничего не делаю. Это просто, чтобы выстрелить обратно. То, что я имею в виду, потеряв данные, заключается в том, что все строки в репитере исчезли после обратной передачи. – Tys

ответ

3

Привязать Repeater в OnInit вместо этого.

http://codinglifestyle.wordpress.com/2009/10/08/repeaters-and-lost-data-after-postback-viewstate/

Edit: Я предполагаю, что вы обработки UserControl 's Load событие, которое получает повышенную послеPage' s Load событий. Динамические элементы управления должны быть созданы в Page_Load не позднее.

http://forums.asp.net/t/1191194.aspx

Так как связать ваш ретранслятор в Page_Init или -что я бы рекомендовал:

Обеспечить общественную функцию, как BindData, который может быть вызван из нагрузки события вашей страницы. Это также рекомендуется, так как страница является контроллером UserControl.

public void BindData() 
{ 
    var products = (from p in context.Products 
        select p).Take(30); 

    rptProducts.DataSource = products; 
    rptProducts.DataBind(); 
} 
+2

Это может быть или не быть релевантным в зависимости от некоторых оставшихся без ответа вопросов, и у него есть привязка в блоке if (! Page.IsPostback), поэтому проблема заключается не в том, что ретранслятор восстанавливает обратную передачу и теряет значения таким образом. – David

+1

Перемещение привязки к OnInit не имело никакого значения. Я вижу, что в этой теме больше дискуссий по всему Интернету. Может быть, это поведение по дизайну? Или ошибка? – Tys

+0

@TysHTTP: Вы пробовали метод-подход? Должен признаться, что раньше я не слышал такого поведения, но я всегда связываю свои пользовательские элементы управления с их контроллером (f.e. Page). –

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