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>