2016-02-29 46 views
1

我正在尝试做左侧导航,并且我能够获取父项的子项,但不能获得孙子项。 Theres主文件夹下有4个文件夹,每个文件夹都有3个项目,全部使用相同的模板。如何让sitecore中的儿童和孙子们得到

> Main/ 
     Folder 1/ 
>  item1 
>  item2 
>  item3 
     Folder 2/ 
>  item1 
>  item2 
>  item3 
     Folder 3/ 
>  item1 
>  item2 
>  item3 
     Folder 4/ 
>  item1 
>  item2 
>  item3 

我使用一个中继器来启动:

<ul> 
    <asp:Literal ID="litFolder" runat="server" /> 
    <asp:Repeater ID="leftNav" runat="server" OnItemDataBound="leftNav_ItemDataBound"> 
     <HeaderTemplate> 
     <li> 
     </HeaderTemplate> 

     <ItemTemplate> 
      <asp:Repeater ID="rptsubleftNav" runat="server" OnItemDataBound="rptsubleftNav_ItemDataBound"> 

       <HeaderTemplate> 
        <ul> 
       </HeaderTemplate> 
       <ItemTemplate> 
         <li> 
         <asp:HyperLink ID="HLMainnav" runat="server"></asp:HyperLink> 
         </li> 
       </ItemTemplate> 
       <FooterTemplate> 
        </ul> 
       </FooterTemplate> 

      </asp:Repeater> 
     </ItemTemplate> 

     <FooterTemplate> 
     </li> 
     </FooterTemplate> 
    </asp:Repeater> 
</ul> 

的前端设置,以使他们联系,但目前其仅在文件夹中,这在本质上是使他们拉动,而不是链接的项目在文件夹中。

public partial class LeftNav : System.Web.UI.UserControl 
{ 

    Item currentItem = Sitecore.Context.Item; 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     leftNav.DataSource = Sitecore.Context.Database.GetItem("/sitecore/Main/").Children; 
     leftNav.DataBind(); 

    } 

    public void leftNav_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     Item currentItem = (Item)e.Item.DataItem; 
    ((Literal)e.Item.FindControl("litFolder")).Text = currentItem.Name; 

     if (currentItem != null) 
     { 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       var subNav = e.Item.FindControl("rptsubleftNav") as Repeater; 

       if (subNav != null) 
       { 
        subNav.DataSource = currentItem.GetChildren(); 
        subNav.DataBind(); 
        currentItem.ToString(); 

        HyperLink HLMainnav = (HyperLink)e.Item.FindControl("HLMainnav"); 
        HLMainnav.NavigateUrl = LinkManager.GetItemUrl(currentItem); 
        HLMainnav.Text = currentItem.Name; 
       } 
      } 
     } 
    } 

    protected void rptsubleftNav_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 

    } 

如何获得下一级别并将它们设置为链接而不是文件夹?

(已更新) 我有文件夹及其子文件,但不显示名称。我在前端使用<%#的eval(“标题”)%>也试过,但它说,Sitecore的项目不具有场当它。所以不知道如何正确显示项目,但没有标题。

回答

3

您需要在leftNav中继器ItemTemplate标签内添加另一个中继器。

然后在leftNav_ItemDataBound方法中,获取currentItem的子项并将它们分配为新转发器的数据源。

这里是类似的问题(Sitecore) Navigation with Subnavigation

就是这样。

+0

确定生病试试这个感谢 – Keith

+0

不要忘了从生成链接排除该文件夹的项目。您可以使用类似item.TemplateID == [FolderTemplateID]从列表中排除它们或不为他们生成的链接。 – Gabbar

+0

好吧,我也会添加这个,谢谢 – Keith