Категория и подкатегория в одном выпадающем списке для — ASP.NET MVC

#c# #asp.net #entity-framework #asp.net-core-mvc

#c# #asp.net #entity-framework #asp.net-core-mvc

Вопрос:

Я хочу перечислить категории, как на картинке:

введите описание изображения здесь

Теперь я мог только перечислить все категории, используя VievComponent.

У меня есть такой модельный класс, как этот

 public class CategoryModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }

    public int? ParentId { get; set; }
}
 

Класс ViewComponent

 public class CategoryListViewComponent : ViewComponent
{
    private ICategoryService _categoryService;
    public CategoryListViewComponent(ICategoryService categoryService)
    {
        _categoryService = categoryService;
    }
    public IViewComponentResult Invoke()
    {
        return View(new CategoryListModel()
        {
            SelectedCategory = RouteData.Values["category"]?.ToString(),
            Categories = _categoryService.GetAll()
        });
    }
 

Просмотр файла компонента

 @foreach (var item in Model.Categories)
{
    <li class="menu-item menu-item-submenu" data-menu-toggle="hover" aria-haspopup="true">
        <a asp-controller="Admin" asp-action="CategoryList" asp-route-category="@item.Name.ToLower()" class="menu-link @(Model.SelectedCategory==item.Name.ToLower()?"active":"")">
            <span class="menu-text">@item.Name</span>
            <i class="menu-arrow"></i>
        </a>
    </li>
}
 

И контроллер

 public IActionResult CategoryList()
{
    return View(new CategoryListModel()
    {
        Categories = _categoryService.GetAll()
    });
}
 

Таким образом, я могу перечислить все свои категории, но как я могу перечислить основные и подкатегории, как на картинке?

результат: введите описание изображения здесь

Комментарии:

1. Не могли бы вы показать нам текущий результат с приведенными выше кодами?

2. конечно, я добавил это в конец вопроса

Ответ №1:

Я думаю, у вас должна быть другая модель для элементов подкатегории, что-то вроде этого:

Модель:

 public class CategoryModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<SubCategoryModel> SubCategories { get; set; }
}

public class SubCategoryModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class CategoryListModel
{
    public string SelectedCategory { get; set; }
    public List<CategoryModel> Categories { get; set; }
}
 

Просмотр страницы компонента:

 <ul>
    @foreach (var item in Model.Categories)
    {
        <li class="menu-item menu-item-submenu" data-menu-toggle="hover" aria-haspopup="true">
            <a asp-controller="Admin" asp-action="CategoryList" asp-route-category="@item.Name.ToLower()" class="menu-link @(Model.SelectedCategory==item.Name.ToLower()?"active":"")">
                <span class="menu-text">@item.Name</span>
                <i class="menu-arrow"></i>
            </a>
        </li>
        @if (item.SubCategories != null amp;amp; item.SubCategories.Count > 0)
        {
            foreach (var subitem in item.SubCategories)
            {
                <li class="menu-item menu-item-submenu" data-menu-toggle="hover" aria-haspopup="true">
                    <a asp-controller="Admin" asp-action="CategoryList" asp-route-category="@subitem.Name.ToLower()" class="menu-link">
                        <span class="menu-text">@item.Name > @subitem.Name</span>
                        <i class="menu-arrow"></i>
                    </a>
                </li>
            }
        }
    }
</ul>
 

Класс ViewComponent:

 public class CategoryListViewComponent : ViewComponent
{
    private ICategoryService _categoryService;
    public CategoryListViewComponent(ICategoryService categoryService)
    {
        _categoryService = categoryService;
    }
    public IViewComponentResult Invoke()
    {
        return View(new CategoryListModel()
        {
            Categories = _categoryService.GetAll()
        });
    }
}
 

CategoryService:

 public class CategoryService : ICategoryService
{
    public List<CategoryModel> GetAll()
    {
        var categories = new List<CategoryModel>
        {
            new CategoryModel{ Id = 1, Name = "AA", SubCategories = new List<SubCategoryModel>
                {
                    new SubCategoryModel{ Id = 1, Name = "A1"},
                    new SubCategoryModel{ Id = 2, Name = "A2"},
                } 
            },
            new CategoryModel{ Id = 2, Name = "BB" , SubCategories = new List<SubCategoryModel>
                {
                    new SubCategoryModel{ Id = 1, Name = "B1"},
                    new SubCategoryModel{ Id = 2, Name = "B2"},
                } 
            },
            new CategoryModel{ Id = 3, Name = "CC"},
            new CategoryModel{ Id = 4, Name = "DD"},
        };
        return categories;
    }
}
 

Результат:

введите описание изображения здесь

Обновить:

 public List<CategoryModel> GetAll()
{
    var categories = new List<CategoryModel>
    {
        new CategoryModel{ Id = 1, Name = "AA"},
        new CategoryModel{ Id = 2, Name = "BB"},
        new CategoryModel{ Id = 3, Name = "CC", ParentId = 1},
        new CategoryModel{ Id = 4, Name = "DD", ParentId = 1},
        new CategoryModel{ Id = 5, Name = "EE", ParentId = 2},
        new CategoryModel{ Id = 6, Name = "FF", ParentId = 2},
    };

    return categories;
}
 

Вид:

 <ul>
    @foreach (var item in Model.Categories)
    {
        @if (item.ParentId == null)
        {
            <li class="menu-item menu-item-submenu" data-menu-toggle="hover" aria-haspopup="true">
                <a asp-controller="Admin" asp-action="CategoryList" asp-route-category="@item.Name.ToLower()" class="menu-link @(Model.SelectedCategory==item.Name.ToLower()?"active":"")">
                    <span class="menu-text">@item.Name</span>
                    <i class="menu-arrow"></i>
                </a>
            </li>
        }

        foreach (var subitem in Model.Categories.Where(s => s.ParentId == item.Id))
        {
            <li class="menu-item menu-item-submenu" data-menu-toggle="hover" aria-haspopup="true">
                <a asp-controller="Admin" asp-action="CategoryList" asp-route-category="@subitem.Name.ToLower()" class="menu-link">
                    <span class="menu-text">@item.Name > @subitem.Name</span>
                    <i class="menu-arrow"></i>
                </a>
            </li>
        }

    }
</ul>
 

Комментарии:

1. спасибо, это сработало, так есть ли способ сделать это без таблицы подкатегорий?

2. Да, вы можете установить ParentId , тогда он будет воспроизводить подкатегорию, смотрите Мое обновление.