Повторитель привязки данных заставляет повторитель загружать все элементы дважды - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть повторитель, к которому я привязываю список из 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 () вызывается только один раз.

Ответы [ 2 ]

4 голосов
/ 13 сентября 2010

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

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

2 голосов
/ 13 сентября 2010

Обычно вы должны проверять !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
    }
}

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

...