2016-12-15 41 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转换,您可以在中提到的使用方法中使用嵌套控制文章。

但是,请记住,如中继器嵌套列表控件会对性能产生负面影响,并通常被认为是不好的做法,因为你会被执行:

没有行*嵌套的中继器的数量+ 1

SQL查询。因此强烈建议至少缓存结果。

0

您是否为此创建了自定义Web部件?如果是的话,那么它在我看来像你的代码一切正常,也许检查DataSet的孩子,只是为了确保是否有多个元素。另外,好的方法是定义ASP元素中的.ascx,然后从代码值填充在他们身后,f.e:

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

您可以定义事件的ItemDataBound嵌套中继器也,并填充它。

1

建议使用Hierarchical Viewers而不是嵌套中继器,就像Enn提到的那样,嵌套中继器会影响性能。

Here是一些关于如何使用它的文档。