In una applicazione MVC potrebbe essere necessario paginare i risultati, ovvero, magari il risultato di una query ritorna qualche centinaio di risultati, e nella pagina web vogliamo farne vedere 10 per pagina e navigare tra le pagine.
Non è una cosa complicata, anzi, è molto semplice, sia che venga fatto con "nostro codice", sia utilizzando librerie di terze parti. una di questa librerie è
MVC Contrib.
In questo post vi parlerò di MVC Contrib, un progetto per aggiungere funzionalità e facilità d'uso al Microsoft ASP.NET MVC Framework, utile per gli sviluppatori che cercano di sviluppare e testare gli elementi dell'interfaccia utente, in particolare sull'utilizzo di
MVC Contrib Grid, "una griglia" per la paginazione.
Quindi,scarichiamo la libreria, includiamola nel progetto, e nel nostro controller richiamiamo i namespace necessari:
using MvcContrib.Pagination;
using MvcContrib.UI.Grid;
using MvcContrib;
using MvcContrib.UI.Pager;
Immaginiamo di dover visualizzare un elenco di oggetti Customer, richiamati da un repository, definiti come :
public class Customer
{
public int Id { get; set; }
public string Surname { get; set; }
public string Forename {get; set; }
public DateTime DateOfBirth { get; set; }
}
Nel controller :
public class CustomerController : Controller
{
private CustomerRepository _customRep = new CustomerRepository();
public ActionResult Index(int? page)
{
var pagedCustomers = _customRep.FindAll().AsPagination(page ?? 1, 10);
return View(pagedCustomers);
}
nella View relativa, invece, importiamo i NameSpace necessari:
<%@ Import Namespace="MvcContrib.UI.Grid" %>
<%@ Import Namespace="MvcContrib.UI.Grid.ActionSyntax" %>
<%@ Import Namespace="MvcContrib.Pagination"%>
<%@ import Namespace="MvcContrib.UI.Pager" %>
e costruiamo la griglia:
<%= Html.Grid(Model).Columns(column => {
column.For(cust => cust.Id).Named("Custome ID").DoNotEncode();
column.For(cust => cust.Surname).Named("Surname").DoNotEncode();
column.For(cust => cust.DateOfBirth).Named("Date Of Birth").DoNotEncode();
}) %>
<%= Html.Pager((IPagination)Model) %>
Questo è solo un esempietto che mostra come paginare una semplice visualizzazione di risultati, naturalemnte è possibile inserire all'interno delle "colonne" non solo dati ma altre cose tipo ActionLink, ad esempio:
column.For(cust => Html.ActionLink(cust.Id, "Details", new { id = cust.Id })).Named("Customer ID").DoNotEncode();
invece di mostrare il solo id, crea un link all'actionResult "Details" passando come parametro il customer id;
oppure, ipotizziamo che il customer abbia un ulteriore property chiamata "Photo" dove sia inserito l'indirizzo di un immagine:
column.For(cust => Html.ActionLinkPhoto(cust.Id, cust.Photo, "Details", new { id = cust.Id })).Named("Customer ID").DoNotEncode();
dove ActionLinkPhoto è una classe negli Helper scritta appositamente per avere un action link dove invece di avere una "scritta", si ha un'immagine.