2016-09-23 4 views
0

ネストされたリピーター内でHyperlink Controlを取得して、現在のSitecoreテンプレートの「Item No」フィールド値または「Menu Title」フィールド値を表示しようとしています。これらのフィールドの1つは、リピータ内でソートされたすべてのテンプレートに存在します。しかし、私が直面している問題は、コードの背後にあるItemDataBound関数がハイパーリンクコントロールを見つけることです。これまでのところ、コードはそれが存在しないと言っています。ここで2つのSitecoreテンプレートフィールドの1つをネストされたリピーターのハイパーリンクに配置します

はリピーターです:

<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

これは私が思いついたものです。動作しているようです:それは最高のアイデアだ

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> 

わからない場合は、それが動作します。私はまだもっと良いアプローチがあるかどうかについて興味があるので、追加の解決策はまだ歓迎されています。

0

次の構文を使用する必要があります。

 foreach (Item catProduct in catProducts) 
     { 
      if (catProduct.TemplateID.ToString() == productListingTemplateID.ToString()) 
      { 
       itemLink.Text = catProduct["Menu Title"]; 

       .. Use the same syntax for Item No.. 
      } 

      .... 

それが文字列の場合は商品にインデクサを使用してフィールドの値を参照することができます。そうすれば、Object Reference Errorsを得ることはできません。空の文字列だけです。

あなたが使用していたコードでは、Fieldを文字列に変換しようとしていましたが、それは動作しますが、インデクサーを使用する方が安全でコードが少なくて済みます。

[複数のフィールド]のようなより複雑なフィールドには、[フィールド]プロパティを使用できます。

関連する問題