[ELMA3] Создание меню с древовидной структурой
В статье приведен пример создания меню с древовидной структурой. В данном примере создано простое дерево с родительским пунктом и с дочерними пунктами меню. Реализовать данное дерево можно для любого простого пункта меню (без дополнительной разметки, например, без фильтров под пунктом меню). В примере каждый элемент дерева является фильтром.
Пример отображения данных

Рис. 1. Меню древовидной структуры
Методы расширения (интерфейса)
Точка расширения (интерфейс) IMenuItemRenderer имеет следующие методы:
/// <summary> /// Имеет ли элемент меню кастомное отображение /// </summary> /// <param name="item">Элемент меню для построения дерева</param> /// <returns></returns> bool HasCustomRender(MenuItemNode item); /// <summary> /// Сгенерировать разметку для элемента меню /// </summary> /// <param name="htmlHelper">Хелпер</param> /// <param name="item">Элемент меню для построения дерева</param> /// <returns></returns> MvcHtmlString Render(HtmlHelper htmlHelper, MenuItemNode item);
Пример класса точки расширения
[Component]
public class MenuItemRenderer : IMenuItemRenderer
{
public bool HasCustomRender(MenuItemNode item)
{
return item.Code == MyObjectMenu.NewPoint;
}
public MvcHtmlString Render(HtmlHelper htmlHelper, MenuItemNode item)
{
const bool highlightPath = true;
var html = htmlHelper;
var list = new List<TreeMenuNode>();
if (item.Code == MyObjectMenu.NewPoint)
{
list.Add(new TreeMenuNode
{
id = "my_menu",
Selected = true,
text = SR.T("Все объекты"),
href = html.Url().Action("FilterObject", "Home", new { area = RouteProvider.AreaName }),
children = new List<TreeMenuNode>
{
new TreeMenuNode
{
id = "Emails",
text = SR.T("Письма"),
href = html.Url().Action("FilterObject", "Home", new {area = RouteProvider.AreaName, obj = SR.T("Письмо")})
},
new TreeMenuNode
{
id = "ICQ",
text = SR.T("ICQ"),
href = html.Url().Action("FilterObject", "Home", new {area = RouteProvider.AreaName, obj = SR.T("ICQ")})
},
}
});
}
return html.Tree(list, "main_menu_tree_channels", highlightPath);
}
}
Примечание:
Каждый пункт меню вызывает действие FilterObject в контроллере Home и передает в него параметр для фильтрации.
Пример используемого кода контроллера Home:
[ContentItem]
public ActionResult FilterObject(string obj)
{
var filter = CreateFilter();
filter.Type = new DropDownItem(obj);
return View("FilterObjects", CreateGridData(new GridCommand(), filter));
}