我正在尝试使用递归帮助器返回应用程序中的嵌套页面列表。但是我在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)不会返回任何结果。我确定答案非常简单,但我现在已经打了好几天了,这让我烦恼。
非常感谢一些帮助。
答案 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
查询结果将不会返回任何结果。