In questa lezione vediamo come poter meglio controllare i parametri che compongono l'URL, inserendo dei vincoli. Prendiamo per esempio la seguente regola, vista nella lezione precedente:
{controller}/{action}/{id}
La regola è verificata per URL come i seguenti:
gallery/show/5 gallery/show/134 ...
Le azioni dei controller cui questa regola è associata, ad esempio Detail
, si aspettano di ricevere un valore di tipo Integer
per il parametro {id}
:
public ActionResult Detail(int id) { }
ASP.NET, tuttavia, non esegue alcun controllo automatico sul valore dei parametri ed utilizza soltanto la struttura degli URL per verificare le regole di routing. La regola precedente è verificata quindi anche per URL che contengono un parametro {id}
di tipo non numerico:
gallery/show/blabla gallery/show/testoAcaso
Richiamare uno degli URL precedenti nella nostra galleria di immagini genererà una eccezione, poichè ASP.NET cercherà di richiamare l'azione corrispondente (come Detail
, che necessita di un ID numerico) passandogli un valore di tipo String
.
Per ovviare a questi problemi il meccanismo di routing ci mette a disposizione i Route Constraints con cui è possibile dichiarare dei vincoli a cui i parametri devono sottostare per essere considerati validi. È possibile dichiarare i constraints direttamente nella chiamata alla funzione MapRoute
:
routes.MapRoute( "Gallery", "{controller}/{action}/{id}", new { controller = "Gallery", action = "Index", id = "" }, new { id = @"d+" } );
Abbiamo già incontrato i primi tre parametri della funzione nella lezione precedente; il nuovo parametro definisce un route constraint sul parametro {id}
attraverso l'uso di espressioni regolari. Perchè l'URL sia considerato valido, quindi, {id}
dovrà essere formato da una o più cifre numeriche.
ASP.NET permette anche di definire nuovi route constraints, utili per esigenze specifiche. La creazione di vincoli personalizzati esula tuttavia dagli scopi di questa guida.