Browse products by categories
Razor code
@using System.Linq
@using MvcPaging.Demo.Models
@model ViewByCategoriesViewModel
@{
ViewBag.Title = "Browse products by categories";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("ViewByCategories", "Paging", FormMethod.Get))
{
<p>
Select category or categories:
<ul>
@foreach (var category in Model.AvailableCategories)
{
<li>
<label>
<input type="checkbox" name="categories" value="@category" @if(Model.Categories.Any(c => c == category)) { <text> checked="checked"</text>} />
@category
</label>
</li>
}
</ul>
<input type="submit" value="Browse" />
</p>
}
@if (Model.Products.Any())
{
<table class="grid">
<thead>
<tr>
<th>Product name</th>
<th>Category</th>
</tr>
</thead>
<tbody>
@foreach (var product in Model.Products)
{
<tr>
<td>@product.Name</td>
<td>@product.Category</td>
</tr>
}
</tbody>
</table>
<div class="pager">
@Html.Pager(Model.Products.PageSize, Model.Products.PageNumber, Model.Products.TotalItemCount).Options(o => o
.AddRouteValueFor(m => m.Categories)
.DisplayFirstAndLastPage()
.SetFirstPageText("First")
.SetLastPageText("Last")
.SetPreviousPageText("Prev")
.SetNextPageText("Next"))
Displaying @Model.Products.ItemStart - @Model.Products.ItemEnd of @Model.Products.TotalItemCount item(s)
</div>
}
Controller code
public ActionResult ViewByCategories(string[] categories, int? page)
{
var model = new ViewByCategoriesViewModel();
model.Categories = categories ?? new string[0];
int currentPageIndex = page.HasValue ? page.Value - 1 : 0;
model.Products = this.allProducts.Where(p => model.Categories.Contains(p.Category)).ToPagedList(currentPageIndex, DefaultPageSize);
model.AvailableCategories = this.allCategories;
return View("ProductsByCategories", model);
}