我正在尝试在嵌套转发器中获取HyperLink控件,以显示当前Sitecore模板的“Item No”字段值或“Menu Title”字段值。其中一个字段将存在于在转发器中排序的所有模板上。但我面临的问题是获取ItemDataBound函数后面的代码来找到Hyperlink控件。到目前为止,代码一直说它不存在。
这是转发器:
<asp:Repeater ID="ProductCategories" runat="server" ItemType="Sitecore.Data.Items.Item" Visible="true" OnItemDataBound="ProductCategories_ItemDataBound">
<ItemTemplate>
<div class="left-nav-section clearfix">
<div class="left-nav-section-arrow clearfix"></div>
<a class="left-nav-sub-section-title" href="<%# Sitecore.Links.LinkManager.GetItemUrl(Item) %>" runat="server">
<%# Item.Fields["Menu Title"].Value %>
</a>
<div class="the-tiers">
<asp:Repeater runat="server" ID="CategoriesRepeater" ItemType="Sitecore.Data.Items.Item">
<ItemTemplate>
<asp:HyperLink ID="ItemURL" runat="server" NavigateUrl="<%# Sitecore.Links.LinkManager.GetItemUrl(Item) %>"/>
</ItemTemplate>
</asp:Repeater>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
这是该转发器的ItemDataBound事件:
protected void ProductCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var catItem = e.Item.DataItem as Item;
Repeater categoriesRepeater = e.Item.FindControl("CategoriesRepeater") as Repeater;
var catProducts = catItem.GetChildren();
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
HyperLink itemLink = (HyperLink)e.Item.FindControl("ItemURL");
foreach (Item catProduct in catProducts)
{
if (catProduct.TemplateID.ToString() == productListingTemplateID.ToString())
{
itemLink.Text = catProduct.Fields["Menu Title"].ToString();
}
else
{
itemLink.Text = catProduct.Fields["Item No"].ToString();
}
}
}
if (catProducts.ToList().Count == 0)
{
return;
}
categoriesRepeater.DataSource = catProducts;
categoriesRepeater.DataBind();
}
以下是我尝试设置超链接的文本属性时出现的错误:
Object reference not set to an instance of an object
答案 0 :(得分:0)
经过一段时间的实验,这就是我想出来的,似乎有效:
protected void ProductCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var catItem = e.Item.DataItem as Item;
Repeater categoriesRepeater = e.Item.FindControl("CategoriesRepeater") as Repeater;
var catProducts = catItem.GetChildren();
categoriesRepeater.DataSource = catProducts;
categoriesRepeater.DataBind();
}
protected void Categories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var catItem = e.Item.DataItem as Item;
HyperLink itemLink = e.Item.FindControl("ItemURL") as HyperLink;
if (catItem.Fields["Item No"] != null)
{
itemLink.Text = catItem.Fields["Item No"].ToString() + "<br />";
}
else
{
itemLink.Text = catItem.Fields["Menu Title"].ToString() + "<br />";
}
}
<asp:Repeater ID="ProductCategories" runat="server" ItemType="Sitecore.Data.Items.Item" Visible="true" OnItemDataBound="ProductCategories_ItemDataBound">
<ItemTemplate>
<div class="left-nav-section clearfix">
<div class="left-nav-section-arrow clearfix"></div>
<a class="left-nav-sub-section-title" href="<%# Sitecore.Links.LinkManager.GetItemUrl(Item) %>" runat="server">
<%# Item.Fields["Menu Title"].Value %>
</a>
<div class="the-tiers">
<asp:Repeater runat="server" ID="CategoriesRepeater" ItemType="Sitecore.Data.Items.Item" OnItemDataBound="Categories_ItemDataBound">
<ItemTemplate>
<asp:HyperLink ID="ItemURL" CssClass="left-nav-sub-tier" runat="server" NavigateUrl="<%# Sitecore.Links.LinkManager.GetItemUrl(Item) %>"/>
</ItemTemplate>
</asp:Repeater>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
不确定它是否是最好的主意,但它确实有效。我仍然很好奇是否有更好的方法,所以仍然欢迎额外的解决方案。
答案 1 :(得分:0)
您应该使用以下语法:
foreach (Item catProduct in catProducts)
{
if (catProduct.TemplateID.ToString() == productListingTemplateID.ToString())
{
itemLink.Text = catProduct["Menu Title"];
.. Use the same syntax for Item No..
}
....
如果项目是字符串,则可以使用项目上的索引器引用字段值。这样你就不会得到对象引用错误 - 只是一个空字符串。
在您使用的代码中,您尝试将字段转换为字符串,尽管它可以正常工作,并为您提供更安全的价值,并且使用索引器的代码更少。
您可以将Fields属性用于更复杂的字段,例如Multilist Field。