.NET MVC4中的递归IEnumerable菜单没有返回结果

时间:2015-10-29 22:26:40

标签: c# linq asp.net-mvc-4 recursion entity-framework-6

我正在尝试使用递归帮助器返回应用程序中的嵌套页面列表。但是我在IEnumerable中没有得到任何结果,因此nodes.Any()为空。

共享布局页面和调用导航栏部分的html部分 _Layout

<div id="navbar" class="navbar-collapse collapse">
    @RenderSection("NavigationBar", false)
</div>

在视图中有一个部分调用动作来渲染导航栏 的 Index.cshtml

@section NavigationBar{
    @{Html.Action("Menu", "Page");}
}

PageController 操作&#34; 菜单&#34;如下

[ChildActionOnly]
public ActionResult Menu()
{
    var pagesQuery = new MyMVC.BLL.GetPagesQuery();
    var pages = pagesQuery.GetPages();
    return PartialView("_Navigation", pages);
}

pagesQuery 只是:

public IEnumerable<PageContent> GetPages()
{
    _context = _context ?? new dbEntities();
    return _context.PageContents.Where(t => t.PageActive == true && t.ParentPageId != null)
            .OrderBy(t => t.PageOrder);
}

_Navigation 部分视图是:

@model IEnumerable<MyMVC.DAL.PageContent>

@BuildMenu(Model)

@helper BuildMenu(IEnumerable<MyMVC.DAL.PageContent> data, int? parentid = null)
{
    var nodes = from n in data where n.ParentPageId == parentid select n;
    if (nodes.Any()) {
        foreach (var node in nodes.OrderBy(n => n.PageOrder)) {
            @node.PageTitle        
            @BuildMenu(data, node.PageId);
        }
    }
 }

当我在LinqPad中运行以下linq代码时(与上面的var节点行相同),我得到了正确的结果和7个顶级项目。

int? x = null;
var y = from n in PageContents where n.ParentPageId == x select n;
foreach (var title in y){
    Console.Write (title.PageTitle + "|");  
}

Partial中的同一行(上面的Bolded)不会返回任何结果。我确定答案非常简单,但我现在已经打了好几天了,这让我烦恼。

非常感谢一些帮助。

1 个答案:

答案 0 :(得分:2)

GetPages方法中的条件为t.ParentPageId != null

return _context.PageContents
               .Where(t => t.PageActive == true && t.ParentPageId != null)
               .OrderBy(t => t.PageOrder);

然后,您的部分视图最初会在没有parentId的情况下调用BuildMenu助手,因此将使用其默认值null

@BuildMenu(Model)

@helper BuildMenu(IEnumerable<MyMVC.DAL.PageContent> data, int? parentid = null)
{
    ...
}

这意味着帮助程序中的nodes查询结果将不会返回任何结果。