将2个Sitecore模板字段中的一个放入嵌套的Repeater的超链接

时间:2016-09-23 16:35:03

标签: c# hyperlink sitecore repeater sitecore7

我正在尝试在嵌套转发器中获取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

2 个答案:

答案 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。