MvcSiteMap генерирует меню, не мешая

Я настраиваю мое приложение asp.net mvc 5 для использования библиотеки MvcSiteMap. Так что пока я мог успешно настроить хлебные пальцы.
Тем не менее, шаблон для меню является более сложным, чем хлебные лапки. У меня есть усатая версия меню (я не показывал тег ul):

<li{{#class}} class="{{class}}" {{ />class}}>{{! print class name (active, open, etc) if   it exists }}
<a href="{{#link}}{{#createLinkFunction}}{{link}}{{/createLinkFunction}}{{/link}} {{^link}}#{{/link}}" {{#submenu?}} class="dropdown-toggle" {{ />submenu?}}>
{{#icon}}<i class="{{icon}}"></i>{{/icon}}
{{#level-1}}
<span class="menu-text">
{{/level-1}}

{{#level-2}}{{! if level-2 and no icon assigned, use this icon}}
{{^icon}}<i class="icon-double-angle-right"></i>{{/icon}}
{{/level-2}}

{{title}}
{{#badge}}
<span class="badge {{badge-class}} {{tooltip-class}}" {{#tooltip}} title="{{{tooltip}}}"  {{ />tooltip}}>{{{badge}}}
</span>
  {{/badge}}
  {{#label}}
<span class="label {{label-class}}" {{#label-title}} title="{{label-title}}" {{ />label-title}}>{{{label}}}</span>
  {{/label}}
{{#level-1}}
 </span>
{{/level-1}}

{{#submenu?}}<b class="arrow icon-angle-down"></b>{{/submenu?}}
</a>

{{#submenu?}}{{! if we have submenu items, print them recursively }}
<ul class="submenu">
{{#submenu}}
{{> layout.sidenav.items}}
{{/submenu}}
</ul>
{{/submenu?}}
</li>

Таким образом, для каждого узла, это логика для применения. Мне нужно знать, если узел имеет подузлы (подменю), если это узел уровня 1 или уровня 2.
1) Как я могу это знать?
2) Если мне нужно изменить SiteMapNodeModel.cshtml, который, я думаю, мне нужно изменить, как не связываться с хлебными пальцами, так как они используют один и тот же шаблон?

1 ответ

Решение

Сделайте шаблон для MenuHelperModel и дать ему собственное имя, и положить его в /Views/Shared/DisplayTemplates/ папка. Затем вы можете сделать шаблон для SiteMapNodeModel а также SiteMapNodeModelList и дать им нестандартные имена. Скопируйте содержимое MenuHelperModel.cshtml, SiteMapNodeModel.cshtml, а также SiteMapNodeModelList.cshtml в ваших новых пользовательских помощников.

Затем измените переопределения в каждом из помощников HTML в шаблонах, чтобы они вызывали пользовательские шаблоны вместо встроенных шаблонов.

// MyMenu.cshtml
@* // This template is for the root level *@
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

<ul id="menu">
    @foreach (var node in Model.Nodes) { 
        <li>@Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@
            @if (node.Children.Any()) {
                @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@
            }
        </li>
    }
</ul>


// MyMenuNodeList.cshtml
@* // This template is for the descendent lists below the root level *@
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModelList
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

<ul>
    @foreach (var node in Model) { 
        <li>@Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@
            @if (node.Children.Any()) {
                @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@
            }
        </li>
    }
</ul>



// MyMenuNode.cshtml
@* // This template is for the node *@
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

Testing @* <-- // If configured right, Testing will appear before every node *@

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@Model.Title</text>
} else if (Model.IsClickable) { 
    if (string.IsNullOrEmpty(Model.Description))
    {
        <a href="@Model.Url">@Model.Title</a>
    }
    else
    {
        <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
    }
} else { 
    <text>@Model.Title</text>
}

Затем вызовите свой корневой шаблон из меню.

@Html.MvcSiteMap().Menu("MyMenu")

Вы можете использовать это в качестве отправной точки, а затем внести соответствующие изменения в представления для вывода желаемого HTML.

Обратите внимание, что SiteMapNodeListHelper шаблон ("MySiteMapNodeList"в этом случае) рекурсивно вызывает себя для каждого последующего уровня узлов.

Другие вопросы по тегам