在一个项目中,我实施了MvcSiteMapProvider,效果很好。 这是使用@ Html.MvcSiteMap()生成的侧边菜单.Menu()
这是菜单的一个节点(Mvc.sitemap文件)。
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="About" controller="Home" action="About"/>
<mvcSiteMapNode title="Project" controller="Home" action="DummyAction">
<mvcSiteMapNode title="List" controller="Home" action="Project"/>
<mvcSiteMapNode title="Edit" controller="Home" action="Edit" preservedRouteParameters="id" visibility="SiteMapPathHelper,!*"/>
</mvcSiteMapNode>
当我加载&#34; List&#34;从&#34; Project&#34;,它显示一个包含所有项目的页面,我可以选择其中一个来加载带有项目相关ID的Edit操作。
问题是,当我在编辑操作页面中时,侧边菜单全部折叠,但我希望有&#34;项目&#34;节点打开了。如果我添加节点&#34;编辑&#34;在菜单中,它工作(匹配节点动作),但我不想要这个节点,因为它对用户没用。
另外,我已经尝试过DefaultSiteMapNodeVisibiltyProvider,我可以隐藏&#34;编辑&#34;节点如果添加,但是当我在&#34;编辑&#34;在操作页面中,项目节点也已关闭。
对于&#34; New / Add&#34;我将面临同样的问题。我不希望在侧边菜单中看到的操作,但可以从项目列表中的链接访问。但是,对于这些操作,我想让用户知道它在&#34; Project&#34;部分,&#34;项目&#34;节点开放。
在GitHub上查看此项目: Project on Github
致以最诚挚的问候,
答案 0 :(得分:0)
您的问题似乎是您没有考虑Menu
HTML帮助程序的递归性质。 Menu
与之交互的模板有3个:
MenuHelperModel.cshtml
SiteMapNodeModelList.cshtml
SiteMapNodeModel.cshtml
问题是您尚未向SiteMapNodeModelList.cshtml
添加适当的逻辑。此外,MenuHelperModel.cshtml
中的逻辑过于复杂。
使用自定义在同一页面上处理Menu
和SiteMapPath
HTML帮助程序的好方法是使用命名模板而不是编辑默认模板。
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<ul id="menu" class="nav sidebar-menu">
@foreach (var node in Model.Nodes)
{
string nodeclass = "";
if (node.IsInCurrentPath && !node.IsRootNode)
{
nodeclass = "active";
if (node.Children.Any())
{
nodeclass += " open";
}
}
<li class="@nodeclass">
@Html.DisplayFor(m => node)
@if (node.Children.Any())
{
// Here we refer to a named template BootstrapMenuNodeModelList.cshtml
@Html.DisplayFor(m => node.Children, "BootstrapMenuNodeModelList")
}
</li>
}
</ul>
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModelList
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<ul>
@foreach (var node in Model)
{
string nodeclass = "";
if (node.IsInCurrentPath && !node.IsRootNode)
{
nodeclass = "active";
if (node.Children.Any())
{
nodeclass += " open";
}
}
<li class="@nodeclass">
@Html.DisplayFor(m => node)
@if (node.Children.Any())
{
// Here we refer to a named template BootstrapMenuNodeModelList.cshtml,
// which happens to be a recursive call to this template.
@Html.DisplayFor(m => node.Children, "BootstrapMenuNodeModelList")
}
</li>
}
</ul>
在此,我们告诉Menu
HTML帮助器使用名为BootstrapMenuHelperModel.cshtml
的自定义模板。
@Html.MvcSiteMap().Menu("BootstrapMenuHelperModel")
注意:您还可以使用相同的方法为
SiteMapNodeModel
创建自定义模板。您只需要调用其他模板中的重载即可使用模板名称。示例:
将
@Html.DisplayFor(m => node)
更改为@Html.DisplayFor(m => node, "MyTemplate")
,并在MyTemplate.cshtml
文件夹中创建名为/Views/Shared/DisplayTemplates/
的相应文件。