我正在配置我的 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(我认为我需要更改),如何不弄乱面包屑,因为它们使用相同的模板?
为以下内容制作一个模板MenuHelperModel
并给它一个自定义名称,然后将其放入/Views/Shared/DisplayTemplates/
文件夹。然后你可以制作一个模板SiteMapNodeModel
and SiteMapNodeModelList
并给它们自定义名称。复制内容MenuHelperModel.cshtml
, SiteMapNodeModel.cshtml
, and 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
在这种情况下)为每个连续级别的节点递归地调用自身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)