在一个项目中,我实现了工作出色的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>
当我从" project“加载"List”时,它会显示一个包含所有项目的页面,并且我可以选择其中之一来使用项目的相关ID加载Edit操作。
问题是,当我在编辑操作页面时,边菜单都被折叠了,但是我希望打开"Project“节点。如果我在菜单中添加了节点"Edit“,它就能工作(匹配节点操作),但我不想要这个节点,因为它对用户毫无用处。
另外,我已经尝试了DefaultSiteMapNodeVisibiltyProvider,如果添加了“编辑”节点,我可以隐藏它,但是当我在“编辑”操作页面中时,项目节点也会关闭。
对于"New/Add“操作,我将面临同样的问题,我不想在侧菜单中看到,但可以从项目列表中的链接中访问。但是,对于这些操作,我想让用户知道它在"Project“部分,其中打开了"Project”节点。
请参阅GitHub:吉特卜项目上的这个项目
诚挚的问候,
发布于 2016-04-02 09:59:16
您的问题似乎是您还没有考虑到Menu
helper的递归特性。有3个Menu
与之交互的模板:
MenuHelperModel.cshtml
SiteMapNodeModelList.cshtml
SiteMapNodeModel.cshtml
问题是您还没有向SiteMapNodeModelList.cshtml
添加适当的逻辑。此外,MenuHelperModel.cshtml
中的逻辑过于复杂。
在同一个页面上处理带有自定义的Menu
和SiteMapPath
helper的一个好方法是使用命名模板,而不是编辑默认模板。
BootstrapMenuHelperModel.cshtml
@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>
BootstrapMenuNodeModelList.cshtml
@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
helper使用我们的自定义模板BootstrapMenuHelperModel.cshtml
。
@Html.MvcSiteMap().Menu("BootstrapMenuHelperModel")
注意:您还可以使用相同的方法为
SiteMapNodeModel
创建一个自定义模板。您只需调用其他模板中的重载即可使用模板名。 示例: 将@Html.DisplayFor(m => node)
更改为@Html.DisplayFor(m => node, "MyTemplate")
,并在/Views/Shared/DisplayTemplates/
文件夹中创建名为MyTemplate.cshtml
的相应文件。
https://stackoverflow.com/questions/36162681
复制相似问题