你如何在果园中为不同的区域创建一个 menuItem alternate
How do you create a menuItem alternate in orchard for different Zones
我为主菜单创建了一个名为 MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml
的备用菜单,因为我想在名为主导航的区域中以不同方式呈现菜单。与其他地方相比,我在页面上使用与页脚相同的菜单。我复制了 MenuItem
形状并将其重命名为 (MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml
) 每次我 运行 它都会因为以下行而溢出。
var renderedMenuItemLink = Display(Model);
有人可以向我解释为什么会发生这种情况,以及为导航创建基于区域的形状的最佳方法。
您从一个形状 (MenuItem) 复制了标记并将其粘贴到另一个形状 (MenuItemLink)。
- MenuItem 为 MenuItemLink 调用 Display
- 然后您在 MenuItemLink 中为 MenuItemLink 调用 Display - 这是一个无限循环。
为 MenuItemLink 添加备用内部主题:
首先。为菜单小部件创建备用 (Parts.MenuWidget.cshtml)
@using Orchard.ContentManagement;
@using Orchard.Widgets.Models;
@{
var widgetPart = ((IContent)Model.ContentItem).As<WidgetPart>();
Model.Menu.Zone = widgetPart.Zone;
}
其次。为菜单项 (MenuItem.cshtml) 创建替代项并添加一行(在行 Model.Metadata.Type = "MenuItemLink"; 之后)
Model.Metadata.Type = "MenuItemLink";
(Model as Orchard.DisplayManagement.Shapes.Shape).Metadata.OnDisplaying(action =>
action.ShapeMetadata.Alternates.Add("MenuItemLink__Zone__" + (string)Model.Menu.Zone)
);
为 MenuItem 添加备用内部主题:
首先。为菜单小部件创建备用 (Parts.MenuWidget.cshtml)
@using Orchard.ContentManagement;
@using Orchard.Widgets.Models;
@using Orchard.DisplayManagement.Shapes;
@{
var widgetPart = ((IContent)Model.ContentItem).As<WidgetPart>();
var items = Model.Menu.Items as List<dynamic>;
AddMenuItemAlternate(items, widgetPart.Zone);
}
@functions{
public void AddMenuItemAlternate(List<dynamic> items, string zoneName)
{
foreach (var item in items)
{
item.Metadata.Alternates.Add("MenuItem__Zone__" + zoneName);
var subitems = (List<dynamic>)Enumerable.Cast<dynamic>(item.Items);
AddMenuItemAlternate(subitems, zoneName);
}
}
}
2015.08更新:
我创建了模块,为菜单、menuItem 和菜单项 link 形状添加小部件名称和区域名称替代。您可以从果园画廊下载一个 https://gallery.orchardproject.net/List/Modules/Orchard.Module.MainBit.Navigation
我为主菜单创建了一个名为 MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml
的备用菜单,因为我想在名为主导航的区域中以不同方式呈现菜单。与其他地方相比,我在页面上使用与页脚相同的菜单。我复制了 MenuItem
形状并将其重命名为 (MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml
) 每次我 运行 它都会因为以下行而溢出。
var renderedMenuItemLink = Display(Model);
有人可以向我解释为什么会发生这种情况,以及为导航创建基于区域的形状的最佳方法。
您从一个形状 (MenuItem) 复制了标记并将其粘贴到另一个形状 (MenuItemLink)。
- MenuItem 为 MenuItemLink 调用 Display
- 然后您在 MenuItemLink 中为 MenuItemLink 调用 Display - 这是一个无限循环。
为 MenuItemLink 添加备用内部主题:
首先。为菜单小部件创建备用 (Parts.MenuWidget.cshtml)
@using Orchard.ContentManagement;
@using Orchard.Widgets.Models;
@{
var widgetPart = ((IContent)Model.ContentItem).As<WidgetPart>();
Model.Menu.Zone = widgetPart.Zone;
}
其次。为菜单项 (MenuItem.cshtml) 创建替代项并添加一行(在行 Model.Metadata.Type = "MenuItemLink"; 之后)
Model.Metadata.Type = "MenuItemLink";
(Model as Orchard.DisplayManagement.Shapes.Shape).Metadata.OnDisplaying(action =>
action.ShapeMetadata.Alternates.Add("MenuItemLink__Zone__" + (string)Model.Menu.Zone)
);
为 MenuItem 添加备用内部主题:
首先。为菜单小部件创建备用 (Parts.MenuWidget.cshtml)
@using Orchard.ContentManagement;
@using Orchard.Widgets.Models;
@using Orchard.DisplayManagement.Shapes;
@{
var widgetPart = ((IContent)Model.ContentItem).As<WidgetPart>();
var items = Model.Menu.Items as List<dynamic>;
AddMenuItemAlternate(items, widgetPart.Zone);
}
@functions{
public void AddMenuItemAlternate(List<dynamic> items, string zoneName)
{
foreach (var item in items)
{
item.Metadata.Alternates.Add("MenuItem__Zone__" + zoneName);
var subitems = (List<dynamic>)Enumerable.Cast<dynamic>(item.Items);
AddMenuItemAlternate(subitems, zoneName);
}
}
}
2015.08更新:
我创建了模块,为菜单、menuItem 和菜单项 link 形状添加小部件名称和区域名称替代。您可以从果园画廊下载一个 https://gallery.orchardproject.net/List/Modules/Orchard.Module.MainBit.Navigation