Tworzenie listy kategorii z wykorzystaniem TagHelper

0

Cześć.

W ramach samorozwoju próbuję nauczyć się (choć podstaw) asp.net core.
Przerabiam w tym celu ASP.NET Core MVC 2. Zaawansowane programowanie. Adama Freemana.

Jestem w rozdziale 9, w którym tworzony jest sklep internetowy, a dokładnie na tworzeniu listy kategorii.
Chcę przerobić ten komponent aby opierał się na klasie modelu widoku i korzystał z TagHelper.

Moje pytania/problemy:

  1. Czy to co zrobiłem jest w ogóle poprawne?
  2. W jaki sposób przekazać informację o aktywnej kategorii (aby ją "podświetlić")?
  3. Dlaczego link do aktywnej kategorii tworzony jest w schmacie: href="/Szachy/Strona1, ale do nieaktywnej już w ten sposób:href="/Strona1?category=Sporty%20wodne"?

Źródła wrzuciłem na githuba: https://github.com/TomaszFilipek/PublicSportStore
W master jest wersja z książki, w CategoryNavigation wersja po moich zmianach.

Z góry dziękuję za pomoc.

0

Odpowiadając na komentarz @Kardash (nie pisałem tego wcześniej, bo założyłem, że łatwiej będzie podejrzeć to w repozytorium, ale przyznaję rację - tutaj powinno być na szybko do podglądu, bez konieczności pobierania repo ;) )

Chcę zmienić sposób tworzenia listy katerogii.
Lista tworzona jest w komponencie NavigationMenu.

Oryginalnie widok tworzony jest w ten sposób:

@model IEnumerable<string>

<a class="btn btn-block btn-secondary"
   asp-action="List"
   asp-controller="Product"
   asp-route-category="">
    Strona główna
</a>

@foreach (string category in Model)
{
    <a class="btn btn-block
        @(category == ViewBag.SelectedCategory ? "btn-primary": "btn-secondary")"
       asp-action="List"
       asp-controller="Product"
       asp-route-category="@category"
       asp-route-productPage="1">
        @category
    </a>
}

Co zrobiłem:
Utworzyłem model widoku CategoryListViewModel:

 public class CategoryListViewModel
    {
        public IEnumerable<Category> Categories { get; set; }
        public CategoringInfo CategoringInfo { get; set; }
    }

oraz klasę pomocniczą CategoringInfo

 public class CategoringInfo
    {
        public int TotalCategories;
        public List<Category> Categories { get; internal set; }
        public string CurrentCategory { get; internal set; }
    }

Następnie zmieniłem sposób tworzenia widoku (a właściwie przekazywany do widoku model) w samym komponencie (w pliku NavigationMenuViewComponent)"

  public class NavigationMenuViewComponent : ViewComponent
    {
        private IProductRepository repository;

        public NavigationMenuViewComponent(IProductRepository repo)
        {
            repository = repo;
        }

        public IViewComponentResult Invoke()
        {
            ViewBag.SelectedCategory = RouteData?.Values["category"];
            IEnumerable<string> categories = repository.Products
                  .Select(x => x.Category)
                  .Distinct()
                  .OrderBy(x => x);

            List<Category> cat = new List<Category>();
            foreach (string c in categories)
                cat.Add(new Category { Name = c });

            CategoringInfo ci = new CategoringInfo
            {
                TotalCategories = categories.Count(),
                Categories = cat
            };

            CategoryListViewModel clvm = new CategoryListViewModel
            {
                Categories = cat,
                CategoringInfo = ci
            };

            return View(clvm);
        }
    }

A na koniec zmieniłem sam widok:

@model CategoryListViewModel

<div category-model="@Model.CategoringInfo" category-action="List"
     category-classes-enabled="true" category-class="btn btn-block" category-class-normal="btn-secondary"
     category-class-selected="btn-secondary">
</div>

1 użytkowników online, w tym zalogowanych: 0, gości: 1