asp.net mvc LINQ查找当前控制器和Action是否存在子代或孙代



我有许多菜单项,包括子菜单和孙菜单,比主菜单项低两级。如果其中一个子或孙具有与当前控制器和当前索引相同的控制器和索引,我希望将主菜单项设置为活动。

这是我的菜单项:

public class MenuItem
{
public int Id { get; set; }
public bool Divider { get; set; }
public bool Header { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public string MenuItemText { get; set; }
public IList<string> Roles { get; set; }
public int ParentId { get; set; }
public MenuItem()
{
}
public MenuItem(int id, bool divider, bool header, string action, string controller, string menuItemText, IList<string> roles,int parentid)
{
Id = id;
Divider = divider;
Header = header;
ActionName = action;
ControllerName = controller;
MenuItemText = menuItemText;
Roles = roles;
ParentId = parentid;
}
}

使用viewcontext,我有了currentcontroller和index。

var routeData = ViewContext.RouteData.Values;
var currentController = routeData["controller"];
var currentAction = routeData["action"];

以下是菜单数据的子集-第一个是主菜单:

//Thats => Id, Divider, Header, ActionName, ControllerName, MenuItemText, List<string> roles, ParentId
MenuList.MenuItems.Add(new MenuItem(800, false, true, null, null, "Admin", new List<string>() { "Admin" }, 0));
MenuList.MenuItems.Add(new MenuItem(810, false, true, null, null, "User Admin", new List<string>() { "Admin" }, 800));
MenuList.MenuItems.Add(new MenuItem(820, false, false, "Index/name_asc/false", "UserAdmin", "List Users", new List<string>() { "Admin" }, 810));
MenuList.MenuItems.Add(new MenuItem(830, false, false, "Create", "UserAdmin", "New User", new List<string>() { "Admin" }, 810));
MenuList.MenuItems.Add(new MenuItem(840, false, false, "FileIndexView", "SuburbsAndPostcodesAdmin", "Suburb & Postcode Maintenance", new List<string>() { "Admin" }, 800));

您会注意到,第一个是主菜单,父项id(最后一个项)表示该菜单项的父项。"0"的Parentid表示它是最重要的项。

如果控制器一直都是一样的,但这个特定的菜单项中有许多不同的控制器,那么这不会是一个问题,所以我需要一个更复杂的LINQ来首先获取与父项(子项和孙项)相关的所有菜单项。然后对照当前控制器和操作测试此列表。

如何构造LINQ查询以获取父项id为0(上例中的顶部)的菜单项的所有子项和子项?

一旦我有了这个列表,我就可以浏览它,但我不确定最初如何获得所有菜单项的列表?

您可能需要考虑使用数据结构来保存菜单之间的这些关系,或者向菜单中添加"children"成员。

在任何情况下,此代码都可以找到主菜单的所有子菜单和子菜单:

var children = MenuList.MenuItems.Where(mi => mi.ParentId == 0);
var grandchildren = MenuList.MenuItems.Where(mi => children.Any(c => c.Id == mi.ParentId));
var descendants = children.Union(grandchildren);

相关内容

最新更新