MVC 5 Динамическая панель навигации 2 уровня

1

В настоящее время у меня есть панель навигации, которая динамически создается из базы данных MS SQL, но я бы хотел добавить второй подслой. Ниже приведено то, что у меня есть для текущей рабочей навигационной панели одного уровня.

навигация

public partial class Navigation
{
    public int Id { get; set; }
    public string Title { get; set; }
    public Nullable<int> Position { get; set; }
    public bool Main { get; set; }
    public string Action { get; set; }
    public string Controller { get; set; }
}

HomeController

[ChildActionOnly]
public ActionResult Navigation()
{
    var navigationModel = (from m in db.Navigations where (m.Main == true) orderby m.Position select m);
    return View(navigationModel);
}

навигация

@{ Layout = null; }
@model IEnumerable<WebApplication1.Models.Navigation>

<ul class="nav sf-menu clearfix">
    @foreach (var item in Model)
    {
        @Html.MenuLink(item.Title, item.Action, item.Controller)
    }
</ul>

Второй уровень должен ссылаться на таблицу содержимого, отношение - db.Navigations.Id = db.Contents.NavigationId.

содержание

public partial class Content
{
    public int Id { get; set; }
    public Nullable<int> NavigationId { get; set; }
    public string Title { get; set; }
    public string Content1 { get; set; }
    public Nullable<int> Position { get; set; }
    public string Image { get; set; }
    public string Sub { get; set; }
    public Nullable<bool> Active { get; set; }
    public string Url { get; set; }
    public string Summary { get; set; }
}

Мог ли кто-нибудь, пожалуйста, предоставить учебник или примерный код того, как я могу привязывать дочерние данные к родительскому набору данных, а затем в представлении, как проверить, содержит ли родительский учет дочерних записей, и если это так происходит через них.

Любая помощь приветствуется :-)

Теги:
navigation
asp.net-mvc-5
sql-server-2012

1 ответ

1
Лучший ответ

Я добавил новый класс под названием NavigationViewModel чтобы объявить таблицы, которые я хочу использовать, и модифицировал HomeController для использования NavigationViewModel для запроса соответствующих таблиц.

NavigationViewModel

namespace WebApplication1.Models
{
    public class NavigationViewModel
    {
        public List<Navigation> Navigation { get; set; }
        public List<Content> Content { get; set; }
    }
}

HomeController

[ChildActionOnly]    
public ActionResult Navigation()
{
    var navigationModel = new NavigationViewModel();
    navigationModel.Navigation = (from m in db.Navigations where (m.Main == true) orderby m.Position select m).ToList();
    navigationModel.Content = (from n in db.Contents where (n.Active == true) orderby n.Position select n).ToList();

    return View(navigationModel);
}

навигация

@model WebApplication1.Models.NavigationViewModel

<ul class="nav sf-menu clearfix">
    @foreach (var navigation in Model.Navigation)
    {
        int records = Model.Content.Count(c => c.NavigationId == navigation.Id);

        if (records > 0)
        {
            @Html.SubMenuLink(navigation.Title, navigation.Action, navigation.Controller)
            @Html.Raw("<ul>")
            foreach (var content in Model.Content.Where(c => c.NavigationId == navigation.Id))
            {
                if (string.IsNullOrEmpty(content.Url))
                {
                    if (string.IsNullOrEmpty(content.Content1))
                    {
                    }
                    else
                    {
                        @Html.MenuLink(content.Title, "Home/Article/" + content.Id + "/" + ToFriendlyUrl(content.Title), "Home");
                    }
                }
                else
                {
                    @Html.MenuLink(content.Title, content.Url, "Home");
                }
            }
            @Html.Raw("</ul>")
            @Html.Raw("</li>")
        }
        else
        {
            @Html.MenuLink(navigation.Title, navigation.Action, navigation.Controller)
        }
    }
</ul>

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню