2012-10-15 71 views
0

有一個INavigationFilter實現爲內容類型填充菜單項。問題是它的一個方法Filter()被兩個線程調用兩次,最後創建兩次菜單項。爲什麼INavigationFilter.Filter(...)調用兩次?

這裏是一個日誌:

2012年10月15日18:35:50650 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 過濾主頁 2012年10月15日18:35:50651 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 過濾 2012年10月15日18:35:50665 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 過濾主頁 2012年10月15日18:35:50666 [ 37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - Filtering 2012-10-15 18:35:50,693 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 產量項目 岩石植物,位置5. 2012-10-15 18:35:50,698 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 產量項目 水生植物,位置7. 2012 -10-15 18:35:50,700 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - Yielding item Wetland plants,position 6. 2012-10-15 18:35:50,702 [14] Zulatm.WebPlants.Handlers。分類導航過濾 - 產量項目 岩石植物,位置5. 2012-10-15 18:35:50,704 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 產量項目 水生植物,位置7. 2012-10-15 18:35 :50,706 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - Y 2012-10-15 18:35:50,708 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 產量項目 草原植物,位置4. 2012-10-15 18:35:50,710 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 屈服項 木本植物,位置3。2012年10月15日18:35:50711 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 屈服項 地衣&苔蘚, 2012-10-15 18:35:50,712 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - Yielding item Herbacious plants,position 4. 2012-10-15 18:35:50,714 [14] Zulatm。 WebPlants.Handlers.TaxonomyNavigationFilter - 產品 蕨類植物&盟友,位置2. 2012-10-15 18:35:50,722 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 產量項目 伍迪植物,位置3. 2012-10-15 18:35:50,724 [ 37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 屈服項 地衣&苔蘚,位置1。2012年10月15日18:35:50726 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 屈服項 蕨類&同盟國位置2

以下代碼的

public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> menuItems) { 

      foreach (var item in menuItems) { 
       Logger.Debug(string.Format("Filtering {0}", item.Text)); 
       if (item.Content != null && item.Content.ContentItem.ContentType == "TaxonomyNavigationMenuItem") { 
        var taxonomyCatalogId = _contentManager 
         .Query("Taxonomy") 
         .Where<TitlePartRecord>(t => t.Title == Migrations.STR_catalogTaxonomyName) 
         .List().Single().Id; 

        IEnumerable<TermPart> termParts = _contentManager 
         .Query<TermPart, TermPartRecord>() 
         .Where(record => record.TaxonomyId == taxonomyCatalogId) 
         .List(); 

        var termsOnZeroLevel = termParts.Where(part => part.GetLevels() == 0); 

        foreach (var termPart in termsOnZeroLevel) { 
         var termMenuItem = new MenuItem(); 

         InitializeTermMenuItem(termMenuItem, termPart, termParts); 

         Logger.Debug(string.Format("Yielding item {0}, position {1}.", termMenuItem.Text, termMenuItem.Position)); 
         yield return termMenuItem; 
        } 
       } 
       yield return item; 
      } 
     } 

UPDATE。

private void InitializeTermMenuItem(MenuItem termMenuItem, TermPart currentTerm, IEnumerable<TermPart> allTerms, string parentPosition = "") { 

var currentPosition = 
       string.IsNullOrWhiteSpace(parentPosition) 
        ? currentTerm.Weight.ToString() 
        : string.Join(".", parentPosition, currentTerm.Weight); 

     termMenuItem.RouteValues = new RouteValueDictionary(
      new { 
       action = "Item", 
       controller = "Home", 
       area = "Contrib.Taxonomies", 
       termPath = currentTerm.Slug 
      }); 
     termMenuItem.Text = T(currentTerm.As<TitlePart>().Title); 
     termMenuItem.Classes.Add("MyTaxonomyClass" + currentTerm.As<TitlePart>().Title); 
     termMenuItem.Position = currentPosition; 
     termMenuItem.Items = new List<MenuItem>(); 

     var childMenuItems = new List<MenuItem>(); 
     termMenuItem.Items = childMenuItems; 
     foreach (var childTerm in allTerms.Where(p => p.Path.StartsWith(currentTerm.FullPath))) { 
      var newChildMenuItem = new MenuItem(); 
      InitializeTermMenuItem(newChildMenuItem, childTerm, allTerms, currentPosition); 
       childMenuItems.Add(newChildMenuItem); 
      } 
} 

UPDATE 2.

public int UpdateFrom11() { 
    ContentDefinitionManager.AlterTypeDefinition(
     "TaxonomyNavigationMenuItem", 
     cfg => cfg 
        .WithPart("MenuPart") 
        .WithPart("CommonPart") 
        .DisplayedAs("Taxonomy catalog menu item") 
        .WithSetting("Description", "Injects taxonomy categories as menu items") 
        .WithSetting("Stereotype", "MenuItem") 
     ); 
    return 12; 
} 

public int UpdateFrom12() { 
    ContentDefinitionManager.AlterTypeDefinition(
     "TaxonomyNavigationMenuItem", 
     cfg => cfg.WithPart("IdentityPart")); 
    return 13; 
} 
+0

嘗試改變'收率返回項目;'在與'否則{屈服返回項的結束; }'。我猜你不想輸出基本項目,但是將它與一組動態生成的項目交換,對吧? –

+0

另外,請提供'InitializeTermMenuItem'方法。並確保你沒有你的*「TaxonomyNavigationMenuItem」*在實際菜單中出現兩次。從我看到它會使所有項目出現兩次,因爲從這個過濾器返回的項目總是相同的每個*「TaxonomyNavigationMenuItem」*。 –

+0

請記住,過濾器不構建層次結構 - 它只是輸出項目的平面列表,在下一步中將從中構建層次結構。因此,如果您需要生成的項目完全顯示在父代位置或下方(*「TaxonomyNavigationMenuItem」*),則還需要相應地設置位置(如果父項爲* 1 *,那麼子項需要爲* 1.1 *, * 1.2 *等)。你沒有那樣做。 –

回答

0

好的,固定的。初始化的MenuItem。內容和第二個副本不見了。這有助於以下代碼生成當前菜單項的副本。我花了一段時間才發現它。

在MenuWidgetPartDriver.Display(..):

var localized = new List<MenuItem>(); 
foreach(var menuItem in menuItems) { 
    // if there is no associated content, it as culture neutral 
    if(menuItem.Content == null) { 
     localized.Add(menuItem); 
    } 

    // if the menu item is culture neutral or of the current culture 
    if (String.IsNullOrEmpty(menuItem.Culture) || String.Equals(menuItem.Culture, currentCulture, StringComparison.OrdinalIgnoreCase)) { 
     localized.Add(menuItem); 
    } 
} 

menuItems = localized; 
相關問題