MvcSiteMap生成菜单而不会弄乱面包屑
我正在配置我的asp.net mvc 5应用程序以使用MvcSiteMap库。 所以,我可以成功配置面包车。
但是,菜单的模板比面包屑更复杂。 我有菜单的胡子版本(我没有显示ul标签):
class}}>{{! print class name (active, open, etc) if it exists }} submenu?}}> {{#icon}}{{/icon}} {{#level-1}} {{/badge}} {{#label}} label-title}}>{{{label}}} {{/label}} {{#level-1}} {{/level-1}} {{#submenu?}}{{/submenu?}} {{#submenu?}}{{! if we have submenu items, print them recursively }} {{/submenu?}}
因此,对于每个节点,这是要应用的逻辑。 我需要知道节点是否有子节点(子菜单),如果它是1级或2级节点。
1)我怎么知道?
2)如果我需要更改SiteMapNodeModel.cshtml,我认为我需要更改,如何不弄乱面包屑,因为他们使用相同的模板?
为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 @foreach (var node in Model) { - @Html.DisplayFor(m => node, "MyMenuNode") @* <-- // Custom Node Helper Name *@ @if (node.Children.Any()) { @Html.DisplayFor(m => node.Children, "MyMenuNodeList") @* <-- // Custom Node Helper Name *@ }
}
// 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") { @Model.Title } else if (Model.IsClickable) { if (string.IsNullOrEmpty(Model.Description)) { @Model.Title } else { @Model.Title } } else { @Model.Title }
// 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
然后从菜单中调用您的根模板。
@Html.MvcSiteMap().Menu("MyMenu")
您可以将此作为起点,然后相应地对视图进行更改以输出所需的HTML。
请注意, SiteMapNodeListHelper
模板(在本例中为“ MySiteMapNodeList
”)以递归方式为每个连续级别的节点调用自身。