你如何在果园中为不同的区域创建一个 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)。

  1. MenuItem 为 MenuItemLink 调用 Display
  2. 然后您在 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