asp.net - Razor 递归树形菜单结构

标签 asp.net razor recursion umbraco

我想我需要一些帮助来使用 Razor View 引擎在 Umbraco 中渲染 af 递归树菜单结构。

我需要渲染以下树形菜单结构:

Page 1
     Page 2
         Page 3
         Page 4
              Page 5
     Page 6
     Page 7

因此,当我在 Page 5 上时,我需要在父节点上使用 CSS 类 "open":Page 4Page 2Page 1 以及我所站立的节点上的 CSS 类 “active”

当单击菜单中的链接时,我已经获得了渲染正确节点的结构,但我根本不知道如何应用正确的类:-(

我的代码如下:

@{
        DynamicNode current = Model;
        var nodes = Model.AncestorOrSelf(2).Children.Where("Visible");        
        if(nodes.Any())
        {
            <ul class="side-nav-list">
                @foreach(var node in nodes)
                {
                    bool isDescendantOrSelf = current.IsDescendantOrSelf(node);
                    <li>
                        <a href="@node.Url">@node.Name</a>
                        @if(isDescendantOrSelf)
                        {
                            @RenderSubMenuRecursive(node)
                        }
                    </li>
                }
            </ul>
        }
    }

@helper RenderSubMenuRecursive(DynamicNode node)
{
    if(node.Children.Any(x => x.GetPropertyValue("umbracoNaviHide").Equals("0") && Model.IsDescendantOrSelf(node)))
    {        
         var childNodes = node.Children.Where(x => x.GetPropertyValue("umbracoNaviHide").Equals("0"));
         string css = node.IsAncestor(Model) ? "open" : "";
         <ul>

            @foreach(var childNode in childNodes)
            {
                <li class="@css">                    
                    <a href="@childNode.Url">@childNode.Name</a>
                    @if (childNode.IsDescendantOrSelf(node))
                    {
                        @RenderSubMenuRecursive(childNode)
                    }
                </li>
            }
        </ul>
    }
}

对此的任何帮助/提示都非常感谢! :-) 提前致谢!

最佳答案

我自己通过移动一些代码等解决了这个问题。最终解决方案:

 @{
        DynamicNode current = Model;
        var nodes = Model.AncestorOrSelf(2).Children.Where("Visible");        
        if(nodes.Any())
        {
            <ul class="side-nav-list">
                @foreach(var node in nodes)
                {                        
                    @RenderSubMenuRecursive(node)                                           
                }
            </ul>
        }
    }

@helper RenderSubMenuRecursive(DynamicNode node)
{    
    var childNodes = node.Children.Where(x => x.GetPropertyValue("umbracoNaviHide").Equals("0"));
string css = node.IsAncestor(Model) ? "open" : "";

if(node.Id == Model.Id)
{
    css = "active";
}

<li class="@css">
    <a href="@node.Url">@node.Name</a>

    <ul>            
        @foreach (var childNode in childNodes.Where(childNode => Model.IsDescendantOrSelf(node)))
        {
            @RenderSubMenuRecursive(childNode)
        }
    </ul>
</li>    
}

关于asp.net - Razor 递归树形菜单结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15565709/

相关文章:

ASP.NET/VB 读/写 Cookie - 对象未设置为对象的实例

c# - Azure webjob 如何访问托管站点文件夹

c# - html.raw 未呈现

css - MVC 3、Divs 和 CSS id 问题

javascript - 如何从另一个 View 上编写的 JS 代码重定向到 Controller 并与其一起传递 JSON 对象

algorithm - 很具体的树遍历方法

asp.net - 如何检测 ASP.NET 中位置所需的角色?

c# - ASP.Net Async MVC Controller 功能导致 Razor View Engine 错误

Java递归编译错误

java - JAXB无尽的数据结构,递归绑定(bind)?