2014-11-06 3 views
1

У меня есть 2 объектов, пользователей и меню, я хочу, чтобы петли в User.Menu создающих ссылки, как это:Перебор значений объекта, который является собственностью другого объекта

@for (int i = 0; i < _Usuario.Menu.Count(); i++) 
{ 
    @Html.ActionLink(Convert.ToString(_Usuario.Menu.LinkName), Convert.ToString(_Usuario.Menu.ActionName),     Convert.ToString(_Usuario.Menu.ControllerName)) 
} 

Но я не имею счетчик для User.Menu, как это можно сделать?

public class User 
{ 
    public Int64 Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public DateTime LoginTime { get; set; } 
    public Menu Menu { get; set; } 
    public List<string> Objects { get; set; } 
    public List<string> Controllers { get; set; } 
    //public List<string> Roles { get; set; } 

    public User() 
    { 
     Objects = new List<string>(); 
     Controllers = new List<string>(); 
    } 
} 

public class Menu 
{ 
    public List<string> LinkName { get; set; } 
    public List<string> ActionName { get; set; } 
    public List<string> ControllerName { get; set; } 

    public Menu() 
    { 
     LinkName = new List<string>(); 
     ActionName = new List<string>(); 
     ControllerName = new List<string>(); 
    } 
} 

ответ

1

Ваш класс меню не имеет особого смысла, так как это означает, что ссылка, действия и имена контроллеров три отдельных набора элементов. На самом деле есть один набор пунктов меню, каждый из которых состоит из ссылки, действия и контроллера. Таким образом, это означает, что вы можете переписать меню, как:

public class Menu 
{ 
    public List<MenuItem> Items { get; set; } 

    public Menu() 
    { 
     Items = new List<MenuItem>(); 
    } 
} 

public class MenuItem 
{ 
    public string LinkName { get; set; } 
    public string ActionName { get; set; } 
    public string ControllerName { get; set; } 
} 

Вам придется переписать код, который устанавливает меню, но это должно быть достаточно легко. Тогда вы можете легко прокрутить на своем экране.

@for (int i = 0; i < _Usuario.Menu.Items.Count(); i++) 
{ 
    @Html.ActionLink(_Usuario.Menu.Items[i].LinkName, _Usuario.Menu.Items[i].ActionName, _Usuario.Menu.Items[i].ControllerName) 
} 
+0

Я бы предпочел, чтобы увидеть 'foreach', а не таким образом, , но +1 в любом случае. – DavidG

+0

Спасибо большое Энди Николс :) –

0

Альтернативный способ заключается в создании шаблона отображения для модели и использовать @Html.DisplayFor(). Таким образом, вам не нужно беспокоиться о цикле, поскольку он сделает это за вас. Это хороший способ сохранить вид бритвы приятным и чистым.

Пример

public class MenuItem 
{ 
    public string LinkName { get; set; } 
    public string ActionName { get; set; } 
    public string ControllerName { get; set; } 
} 

шаблон дисплея (menuitem.cshtml):

@model MenuItem 

@Html.ActionLink(Model.LinkName, Model.ActionName, Model.ControllerName) 

Вид:

@model IEnumerable<MenuItem> 
@Html.DisplayForModel() 
Смежные вопросы