2010-09-13 3 views
1

У меня есть ретранслятор, на котором я связываю список с 3-мя элементами. Databind() вызывается один раз, я проверил это с помощью отладчика. У меня здесь странное поведение, потому что повторитель, кажется, дважды просматривает этот список предметов. Вместо 3 пунктов я вижу, что ретранслятор связывает все дважды.Повторитель привязки данных повторяет загрузку всех элементов дважды

/// <summary> 
    /// Handles the Load event of the Page control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Sitecore.Data.Items.Item contextItem = Sitecore.Context.Item; 
     Sitecore.Data.Fields.MultilistField thisSnippets = contextItem.Fields["snippets"]; 
     List<Item>thisSnippetItems = thisSnippets.GetItems().ToList<Item>(); 

     if (thisSnippetItems.Count > 0) 
     { 
      rptListRenderer.DataSource = thisSnippetItems; 
      rptListRenderer.DataBind(); 
     } 
    } 


    /// <summary> 
    /// Handles the ItemDataBound event of the rptListRenderer control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="System.Web.UI.WebControls.RepeaterItemEventArgs"/> instance containing the event data.</param> 
    private void rptListRenderer_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
     { 
      Item dataItem = (Item)e.Item.DataItem; 

      System.Web.UI.WebControls.PlaceHolder phLiContent = (System.Web.UI.WebControls.PlaceHolder)e.Item.FindControl("phLiContent"); 

      if (phLiContent != null) 
      { 
       Sitecore.Data.Items.DeviceItem listItemDevice = Sitecore.Context.Database.Resources.Devices["List item"]; 
       RenderingReference[] renderings = dataItem.Visualization.GetRenderings(listItemDevice, false); 

       foreach (RenderingReference rendering in renderings) 
       { 
        string strDataSource = dataItem.ID.ToString(); 
        rendering.Settings.DataSource = strDataSource; 

        Sublayout thisControl = (Sublayout)rendering.RenderingItem.GetControl(rendering.Settings);   

        if (blockCounter == 0) 
        { 
         thisControl.Parameters = "class=snippetColHomeFirst"; 
        } 
        else 
        { 
         thisControl.Parameters = "class="; 
        } 

        phLiContent.Controls.Add(thisControl); 

        blockCounter++; 
       } 
      } 
     } 

повторитель HTML:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="hpSnippetList.ascx.cs" Inherits="Snippets.Sublayouts.hpSnippetList" %> 
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %> 
<asp:repeater id="rptListRenderer" runat="server" EnableTheming="false" EnableViewState="false"> 
<itemtemplate> 
    <asp:placeholder id="phLiContent" runat="server" /> 
</itemtemplate> 
</asp:repeater> 

Любые предложения о том, как это можно решить? Загрузка страницы называется только один раз, databind() вызывается только один раз.

+0

вставьте ваш ретранслятор html, а также –

+0

* Вместо трех элементов, я вижу, что повторитель связывает все дважды * - Что вы подразумеваете под этим? Вы получаете 6 элементов в вашем ретрансляторе? –

+0

Я получаю 3 элемента в своем ретрансляторе, а затем вижу - использование отладчика - вызывает код элемента управления. После этого повторитель повторяет три элемента снова, поэтому список элементов состоит из 3-х элементов, но они обрабатываются дважды ... – Younes

ответ

2

Возможно, вы вызвали метод DataBind в одном из родителей элемента управления. Согласно http://msdn.microsoft.com/en-us/library/w5e5992d.aspx (DataBind документов):

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

+0

Я не мог найти методы DataBind, вызываемые в одном из родителей элемента управления. Я нахожу это странное поведение: /. – Younes

+0

@Younes Пользовательский элемент управления, который содержит ваш ретранслятор, может находиться внутри элемента управления, который автоматически связывает данные, поэтому вы можете не видеть явный вызов .DataBind(). –

2

Как правило, вы должны проверить на !Page.IsPostBack при связывании вещей в Page_Load.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     Sitecore.Data.Items.Item contextItem = Sitecore.Context.Item; 
     // ... the rest of the code 
    } 
} 

Это может решить вашу проблему.

+0

Загрузка страницы вызывается только один раз, так что это не так. Но я добавлю это, чтобы быть уверенным. – Younes

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