2016-09-23 46 views
0

我試圖讓嵌套中繼器內的HyperLink控件顯示「Item No」字段值或當前Sitecore模板的「菜單標題」字段值。其中一個字段將存在於通過中繼器進行排序的所有模板中。但是我面臨的問題是獲取ItemDataBound函數的代碼來查找超鏈接控件。到目前爲止,代碼一直說它不存在。將2個Sitecore模板字段之一嵌入中繼器的超鏈接

這裏是中繼器:

<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.. 
      } 

      .... 

您可以參考使用索引字段值的項目,如果它是一個字符串。這樣你就不會得到對象引用錯誤 - 只是一個空字符串。

在您使用的代碼中,您試圖將字段轉換爲字符串,儘管它的工作方式併爲您提供了更安全和更少使用索引器的代碼的值。

您可以使用Fields屬性來處理更復雜的字段,如Multilist字段。