有一个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 - 让步项目 地衣和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;
}
答案 0 :(得分: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;