2016-05-23 23 views
0

メインメニュー項目の2レベル下にある子メニューと孫メニューを持つ多数のメニュー項目があります。子供や孫の1人が現在のコントローラと現在のインデックスと同じコントローラとインデックスを持っている場合、メインメニュー項目をアクティブに設定したいと思います。私はcurrentcontrollerとインデックスを持っているviewcontext使用asp.net mvc LINQ現在のコントローラとアクションに子や孫が存在するかどうか調べる

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; 
    } 
} 

は、これは私のmenuItemです。ここで

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

menudataのサブセットである - 最初はメインメニューです:

 //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(最後の項目が)を示していることに注意しますそのメニュー項目の親。 Parentidが "0"の場合、その上位項目を意味します。

コントローラーがまったく同じであっても、この特定のメニュー項目に多数の異なるコントローラーがある場合、これは問題ではありません。そのため、より洗練されたLINQが必要です。親 - 子供と孫。次に、現在のコントローラとアクションに対してこのリストをテストします。

親ID == 0(上記の例では上の1つ)のメニューアイテムのすべての子と孫を取得するには、どのようにLINQクエリを構成しますか?

私は一度私はそれを持っているリストを実行することができますが、私はどのようにすべてのmenuItemsのこのリストを最初に取得するのか分からない?

答えて

1

データ構造を使用してメニュー間の関係を保持したり、メニューに「子」メンバーを追加したりすることをお勧めします。いずれの場合においても

、このコードは、メインメニューのすべての子供や孫を見つける:

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); 
関連する問題