2016-12-15 3 views
0

Мой CMSRepeater:Вложение нескольких CMSRepeaters в Kentico

<cms:CMSRepeater runat="server" ID="RptMainNav" Path="/menu/%" ClassNames="KP.Home" MaxRelativeLevel="1" OnItemDataBound="RptMainNav_ItemDataBound1" NestedControlsID="RptSubMainNav" OrderBy="NodeOrder,NodeLevel"> 
<ItemTemplate> 
    <li class="navbar-menu-accordion"> 
     <a href='<%# Eval("URL") %>'><%# Eval("Name") %></a> 
     <asp:HiddenField runat="server" ID="HfRpt" Value='<%# Eval("NodeAliasPath") %>' /> 
     <i class="show-for-small hide-for-large fa fa-angle-down search-icon angle-icon"></i> 
     <cms:CMSRepeater runat="server" ID="RptSubMainNav" DelayedLoading="true" StopProcessing="true" OrderBy="NodeOrder,NodeLevel" MaxRelativeLevel="1"> 
      <HeaderTemplate> 
       <ul class="menu below-box-menu"> 
      </HeaderTemplate> 
      <ItemTemplate> 

       <li class="below-box-menu-links"><a href='<%# Eval("URL") %>'><%# Eval("Name") %></a> 

       </li> 

      </ItemTemplate> 
      <FooterTemplate> 
       </ul> 
      </FooterTemplate> 
     </cms:CMSRepeater> 
    </li> 
</ItemTemplate> 

и код за

protected void RptMainNav_ItemDataBound1(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Repeater RptSubMainNav = (Repeater)e.Item.FindControl("RptSubMainNav"); 
     HiddenField HfValue = (HiddenField)e.Item.FindControl("HfRpt"); 



     string GetNode = HfValue.Value; 

     DataSet child = DocumentHelper.GetDocuments("KP.Home").Path(GetNode, PathTypeEnum.Children); 

     // DataSet d= DocumentHelper.GetDocuments("KP.Home").Path(DocumentContext.CurrentDocument.NodeAliasPath, PathTypeEnum.Children); 

     RptSubMainNav.DataSource = child; 
     RptSubMainNav.DataBind(); 




    } 
} 

я получаю только один узел элементов

ответ

1

Предполагая, что код, который вы написали из ASCX, вы можете использовать вложенный элемент управления в том, что используя подход, упомянутый в this статья.

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

Нет строк * число вложенных ретрансляторов + 1

SQL-запросы. Поэтому рекомендуется по крайней мере кэшировать результат.

0

Вы создали пользовательскую веб-часть для этого? Если да, то мне кажется, что все в порядке с вашим кодом, возможно, для проверки дочернего элемента DataSet, чтобы быть уверенным, что существует более одного элемента. Кроме того, хороший подход заключается в определении Asp элементов внутри .ascx, а затем заполнить их значениями из кода позади, f.e .:

<ItemTemplate> 
     <asp:Literal runat="server" ID="TextValueID" /> 
</ItemTemplate> 

Вы можете определить событие ItemDataBound для вложенного повторителя также и заполнить его там.

1

Рекомендуется использовать иерархические средства просмотра вместо вложенных ретрансляторов, так как, как упоминал Энн, вложенные репитеры имеют производительность.

Here есть документация о том, как его использовать.