我在这里有一个非常基本的站点核心问题。我想迭代一组子对象(位置),并显示有关每个对象的一些信息。
我正在使用ASP转发器进行迭代,我正在让孩子们加载页面,我正在尝试使用sc标签来显示信息 - 但我没有显示出来在页面上。
任何人都可以帮助我看看我在这里缺少什么吗?
代码背后:
protected void Page_Load(object sender, EventArgs e)
{
var item = Sitecore.Context.Item;
var children = new List<Sitecore.Data.Items.Item>();
foreach (var child in item.GetChildren())
{
children.Add((Sitecore.Data.Items.Item)child);
}
LocationsRpt.DataSource = children;
LocationsRpt.DataBind();
}
标记:
<asp:Repeater runat="server" ID="LocationsRpt" OnItemDataBound="LocationsRptItemDataBound">
<ItemTemplate>
<div class="InnerContentSec clearfix">
<div id="AboutSolar" class="AboutSolar clearfix">
<div class="items">
<h3>
<sc:Text runat="server" ID="Title"/>
</h3>
<div class="LocationBlock clearfix">
<div class="ImgSec">
<sc:Image id="Image" runat="server" Width="185" Height="107" />
</div>
<div class="DescSec">
<p><sc:Text ID="ShortDescription" runat="server" /></p>
</div>
</div>
</div>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
最后在DataItemBound
上protected void LocationsRptItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var subItem = e.Item.DataItem as Item;
if (subItem != null)
{
var appTitle = e.Item.FindControl("Title") as Sitecore.Web.UI.WebControls.Text;
if (appTitle != null)
{
appTitle.DataSource = subItem.ID.ToString();
appTitle.Field = "Application Title";
appTitle.DataBind();
}
var appImage = e.Item.FindControl("Image") as Sitecore.Web.UI.WebControls.Image;
if (appImage != null)
{
appImage.DataSource = subItem.ID.ToString();
appImage.Field = "Location Image";
appImage.DataBind();
}
var shortDescription = e.Item.FindControl("ShortDescription") as Sitecore.Web.UI.WebControls.Text;
if (shortDescription != null)
{
shortDescription.DataSource = subItem.ID.ToString();
shortDescription.Field = "Short Description";
shortDescription.DataBind();
}
}
}
}
答案 0 :(得分:9)
您也可以这样做:
页面加载:
protected void Page_Load(object sender, EventArgs e)
{
LocationsRpt.DataSource = Sitecore.Context.Item.GetChildren();
LocationsRpt.DataBind();
}
标记:
<asp:Repeater runat="server" ID="LocationsRpt">
<ItemTemplate>
<div class="InnerContentSec clearfix">
<div id="AboutSolar" class="AboutSolar clearfix">
<div class="items">
<h3>
<sc:Text runat="server" ID="Title" Item="<%# Container.DataItem %>"/>
</h3>
<div class="LocationBlock clearfix">
<div class="ImgSec">
<sc:Image id="Image" runat="server" Width="185" Height="107" Item="<%# Container.DataItem %>" />
</div>
<div class="DescSec">
<p><sc:Text ID="ShortDescription" runat="server" Item="<%# Container.DataItem %>" /></p>
</div>
</div>
</div>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
在这种情况下,您不需要数据绑定事件。
答案 1 :(得分:2)
我太快了,你回复后添加了你的事件处理程序代码。
在您的eventhandler中,您应该为字段控件设置Item
属性。
例如:appTitle.Item = item
并且您不需要为这些控件调用DataBind()。
此外,您可以使用item.GetChildren()
作为转发器的数据源,您不必将子项复制到新列表。