Sitecore使用嵌套中继器正确显示父项和子项

时间:2015-05-05 13:47:11

标签: c# asp.net sitecore

在sitecore中我有以下结构:

  
      
  • 欧洲   
        
    • 德国
    •   
    • 法国
    •   
    • 瑞典
    •   
  •   
  • 亚   
        
    • 中国
    •   
    •   
  •   
  • 中东   
        
    • U.A.E
    •   
    • 伊朗
    •   
  •   

我正在使用嵌套转发器在Asp.net中显示此结构

<asp:Repeater runat="server" ID="repSubsidiaryList">
<ItemTemplate>
<li>
 <%# Helper.Field(Container.DataItem as Item, "Short Title)%> 
   <asp:Repeater ID="InnerRepeater" runat="server">
     <ItemTemplate>
       <li>
        <%# Helper.Field(Container.DataItem as Item, "Name")%>
       </li>
      </ItemTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>

以下是代码背后:

List<Item> _countryNameItems = new List<Item>(); 
protected void Page_Load(object sender, EventArgs e)
{
    //get the item Subsidaries in sitecore 
    Item mainSubsidiaryFolderItem = Sitecore.Context.Database.GetItem(Settings.GetSetting("SubsidariesFolder"));

    _countryNameItems = mainSubsidiaryFolderItem.Axes.GetDescendants().Where(p => p.TemplateName == "Subsidiary").ToList();

    // binding Subsidiary Folder to a repeater
    repSubsidiaryList.DataSource = mainSubsidiaryFolderItem.GetChildren();
    repSubsidiaryList.DataBind();
}

private void repSubsidiaryList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    InnerRepeater = (Repeater) item.FindControl("InnerRepeater");
    InnerRepeater.DataSource = _countryNameItems;
    InnerRepeater.DataBind();
}

我得到的结果如下:

  
      
  • 欧洲   
        
    • 德国
    •   
    • 法国
    •   
    • 瑞典
    •   
    • 中国
    •   
    •   
    • U.A.E
    •   
    • 伊朗
    •   
  •   
  • 亚   
        
    • 德国
    •   
    • 法国
    •   
    • 瑞典
    •   
    • 中国
    •   
    •   
    • U.A.E
    •   
    • 伊朗
    •   
  •   
  • 中东   
        
    • 德国
    •   
    • 法国
    •   
    • 瑞典
    •   
    • 中国
    •   
    •   
    • U.A.E
    •   
    • 伊朗
    •   
  •   

我不知道如何获取currentItem然后绑定数据。

2 个答案:

答案 0 :(得分:3)

您的内部转发器始终是_countryNameItems的数据源。用这个替换ItemDataBound方法应该会有所帮助:

private void repSubsidiaryList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
   // Cast the current dataitem to a Sitecore item
   Item item = (Item)e.Item.DataItem; 
   Repeater innerRpt = (Repeater) e.Item.FindControl("InnerRepeater");      
   // bind the inner repeater to the children of the sitecore item
   innerRpt.DataSource = item.Children; 
   innerRpt.DataBind();
}

答案 1 :(得分:1)

我不熟悉sitecore,但你在这里做错了。

您为每个转发器设置相同的_countryNameItems,即List<Item>。因此,理想情况下,您需要在ItemDatabound内提取不同的<asp:Label ID="parentGroupLabel" runat="server" Text='<%# Helper.Field(Container.DataItem as Item, "Short Title")%>'> </asp:Label> 。你可以试试这样的东西

标记(像上面这样更改上面的行像innerRepeater)

protected void repSubsidiaryList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    var templateName = (Label) item.FindControl("parentGroupLabel");
    var InnerRepeater = (Repeater) item.FindControl("InnerRepeater");
    _countryNameItems = mainSubsidiaryFolderItem.Axes.GetDescendants().Where(p => p.TemplateName == templateName.Text).ToList();
    InnerRepeater.DataSource = _countryNameItems;
    InnerRepeater.DataBind();
}

代码隐藏

{{1}}