Browse products by categories

Select category or 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);
}