2015-05-05 3 views
2

В Sitecore я имею следующую структуру:Sitecore Показать родительские и дочерние элементы, правильно используя вложенную Repeater

  • Европа
    • Германия
    • Франция
    • Швеция
  • Азия
    • Китай
    • Таиланд
  • Ближний Восток
    • ОАЭ
    • Иран

Я использую вложенной ретранслятор, чтобы показать эту структуру в 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
    • Иран
  • Asia
    • Германия
    • Франция
    • Швеция
    • Китай
    • Таиланд
    • U.A.E
    • Иран
  • Ближний Восток
    • Германия
    • Франция
    • Швеция
    • Китай
    • Таиланд
    • U.A.E
    • Иран

Я не знаю, как получить CurrentItem, а затем связать данные.

ответ

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

Я не то, что опыт работы с Sitecore, но вы в основном делаете вещи неправильно здесь.

Вы устанавливаете одинаковые List<Item>, т. Е. _countryNameItems на каждый ваш ретранслятор. Поэтому вам в идеале нужно потянуть разные List<Item> внутри ItemDatabound. Вы можете попробовать что-то вроде этого

разметки (изменить строку выше, как innerRepeater, как это)

<asp:Label ID="parentGroupLabel" runat="server" 
     Text='<%# Helper.Field(Container.DataItem as Item, "Short Title")%>'> 
</asp:Label> 

Code-за

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(); 
} 
Смежные вопросы