0

有一个 INavigationFilter 的实现,用于填充内容类型的菜单项。问题是其中的方法 Filter() 从两个线程中调用了两次,最终创建了两倍的菜单项。

这是一个日志:

2012-10-15 18:35:50,650 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 过滤主页 2012-10-15 18:35:50,651 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 过滤 2012-10-15 18:35:50,665 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 过滤主页 2012-10-15 18:35:50,666 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 过滤 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 - 产量项目湿地植物,位置 6。2012-10-15 18:35:50,702 [14] Zulatm.WebPlants.Handlers。TaxonomyNavigationFilter - 产量项目岩石植物,位置 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 - 产量项目湿地植物,位置 6。 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:50,711 [14] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 产量项目地衣& Mosses,第 1 位。2012-10-15 18:35:50,712 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 产量项目草本植物,第 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:50,726 [37] Zulatm.WebPlants.Handlers .TaxonomyNavigationFilter - 产出项目蕨类植物和盟友,位置 2。TaxonomyNavigationFilter - 产出项目 Lichens & Mosses,位置 1。 2012-10-15 18:35:50,726 [37] Zulatm.WebPlants.Handlers.TaxonomyNavigationFilter - 产出项目蕨类植物和盟友,位置 2。TaxonomyNavigationFilter - 产出项目 Lichens & Mosses,位置 1。 2012-10-15 18:35:50,726 [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;
             }
        }

更新。

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);
            }
 }

更新 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;
}
4

1 回答 1

0

好的,解决了。初始化 MenuItem.Content 并且第二个副本消失了。这很有帮助,因为以下代码生成了当前菜单项的副本。我花了一些时间才找到它。

在 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;
于 2012-10-18T16:44:45.893 回答