Как создать альтернативный элемент меню в саду для разных зон?

Я создал альтернативу для главного меню под названием MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml, потому что я хочу по-другому отображать меню в зоне, называемой основной навигацией. по сравнению с другими местами я использую то же меню на странице, что и нижний колонтитул. Я скопировал форму MenuItem и переименовал ее (MenuItemLink-main-menu-MainNavigation-MenuItem.cshtml) каждый раз, когда я запускаю ее, я получаю переполнение из-за следующей строки.

var renderedMenuItemLink = Display(Model);

может кто-нибудь объяснить мне, почему это происходит, и как лучше всего создать формы на основе зон для навигации.


person user1723409    schedule 19.02.2015    source источник


Ответы (1)


Вы скопировали разметку из одной фигуры (MenuItem) и вставили ее в другую фигуру (MenuItemLink).

  1. MenuItem вызывает Display для MenuItemLink
  2. Затем вы вызываете Display для MenuItemLink внутри MenuItemLink — это бесконечный цикл.

Для добавления альтернативной внутренней темы для 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 и пунктов меню. Вы можете загрузить его из галереи садов https://gallery.orchardproject.net/List/Modules/Orchard.Module.MainBit.Navigation

person Alexander Petryakov    schedule 20.02.2015
comment
Это единственный способ иметь альтернативы в зависимости от зоны, в которой они находятся? В настоящее время я пытаюсь отобразить сводку в содержании с другой альтернативой сводке AsideSecond. - person hsimah; 04.07.2015
comment
Нет. Лучше реализовать IShapeTableProvider. Для вашей цели посмотрите классы Orchard.Core.Contents.Shapes и Orchard.Widgets.Shapes. - person Alexander Petryakov; 07.08.2015