【问题标题】:Place one of 2 Sitecore template fields into nested Repeater's Hyperlink将 2 个 Sitecore 模板字段之一放入嵌套中继器的超链接
【发布时间】:2016-09-23 16:35:02
【问题描述】:

我正在尝试在嵌套中继器中获取一个超链接控件,以显示当前 Sitecore 模板的“项目编号”字段值或“菜单标题”字段值。这些字段之一将存在于转发器中排序的所有模板上。但我面临的问题是获取 ItemDataBound 函数背后的代码来查找超链接控件。到目前为止,代码一直说它不存在。

这是中继器:

   <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

【问题讨论】:

    标签: c# hyperlink sitecore repeater sitecore7


    【解决方案1】:

    经过一段时间的实验,这是我想出的,它似乎有效:

        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>
    

    不确定这是否是有史以来最好的主意,但它确实有效。我仍然很好奇是否有更好的方法,因此仍然欢迎其他解决方案。

    【讨论】:

      【解决方案2】:

      您应该使用以下语法:

              foreach (Item catProduct in catProducts)
              {
                  if (catProduct.TemplateID.ToString() == productListingTemplateID.ToString())
                  {
                      itemLink.Text = catProduct["Menu Title"];
      
                      .. Use the same syntax for Item No..
                  }
      
                ....
      

      如果它是一个字符串,您可以使用项目上的索引器来引用字段值。这样你就不会得到对象引用错误——只是一个空字符串。

      在您使用的代码中,您试图将字段转换为字符串,尽管它可以工作并为您提供使用索引器的更安全和更少代码的值。

      您可以将 Fields 属性用于更复杂的字段,例如多列表字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多