获取每个子项并显示它

时间:2012-01-20 11:00:33

标签: c# asp.net content-management-system sitecore

假设我在sitecore cms中有一个父项和三个子项

Home
  -ChildOne 
  -ChildTwo
  -ChildThree

我想遍历所有子项目并使用各自的子布局显示它们。

这是否可行,我需要做些什么才能实现这一目标。

目前,我可以在一个占位符中显示一个项目,我正在考虑使用转发器来执行此操作。

我最好的选择是什么?这有可能吗?您可能会向我建议的方法是否有任何缺点?

2 个答案:

答案 0 :(得分:2)

您可以使用Sitecore的<sc:sublayout ... />控件来完成此操作。

首先,您需要为每个子布局创建一个访问DataSource项的子布局。 Here is sample code I've blogged on the topic

接下来,您需要重复子项并将它们绑定到sublayout控件,同时将每个项目作为DataSource传递:

<强>前端

<asp:Repeater ID="myRepeater" OnItemDataBound="myRepeater_ItemDataBound" runat="server">
  <ItemTemplate>
    <sc:sublayout ID="scSublayout" Path="path/to/your/sublayout/file.ascx" runat="server" />
  </ItemTemplate>
</asp:Repeater>

<强>代码隐藏:

// in the Page_Load
myRepeater.DataSource = homeItem.GetChildren();
myRepeater.DataBind();

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    var scSublayout = e.Item.FindControl("scSublayout") as Sitecore.Web.UI.WebControls.Sublayout;
    if (scSublayout != null)
    {
        scSublayout.DataSource = ((Sitecore.Data.Items.Item)e.Item.DataItem).ID.ToString();
    }
  }
}

答案 1 :(得分:1)

根据您问题的措辞,您似乎希望能够显示所有子项目,无论其类型如何。您在这里遇到的困难将是确定用于显示每个孩子的子布局。

Sitecore不会将项目绑定到单个子布局。首先,它可以有一系列与其绑定的子布局,其次,在项目级别指定哪些子布局绑定到它(您可以在模板标准值上设置默认的演示文稿详细信息,但这可以由项目本身覆盖),第三,根据查看正在查看的设备上下文,项目可能具有与其绑定的不同子布局。除非您找到一种方法将项目配置为在父项目循环时使用单个子布局你很可能会得到一些非常混乱的东西(许多子布局被解包,渲染,嵌套 - 使用相同的占位符)或者一些特别不灵活的东西(一个项目只能有一个子布局,并且这个子布局受限于它的行为方式。)

更好的方法是确定您在与其兄弟姐妹一起观看时要显示的每种项目类型的具体内容。如果您正在寻找每个项目中的类似信息,请获取此信息,并将其用作模板的基础,您的所有项目都来自某个级别(因此它们都有共同的字段)。然后编写一个执行循环的子布局,并可以使用类似转发器的内容为每个项目获取相同的字段。

如果您的商品完全不同,那么您的循环子布局必须能够匹配不同的情况,并为每种情况包含或使用相关的效果图。

希望有所帮助。