Condividi tramite


Creazione di un vincolo di route (C#)

di Stephen Walther

In questa esercitazione Stephen Walther illustra come controllare il modo in cui le richieste del browser corrispondono alle route creando vincoli di route con espressioni regolari.

Si usano vincoli di route per limitare le richieste del browser che corrispondono a una determinata route. È possibile usare un'espressione regolare per specificare un vincolo di route.

Si supponga, ad esempio, di aver definito la route nell'elenco 1 nel file Global.asax.

Elenco 1 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);

L'elenco 1 contiene una route denominata Product. È possibile usare la route Product per eseguire il mapping delle richieste del browser al ProductController contenuto nell'elenco 2.

Elenco 2 - Controller\ProductController.cs

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Details(int productId)
        {
            return View();
        }
    }
}

Si noti che l'azione Details() esposta dal controller Product accetta un singolo parametro denominato productId. Questo parametro è un parametro integer.

La route definita nell'elenco 1 corrisponderà a uno degli URL seguenti:

  • /Product/23
  • /Product/7

Sfortunatamente, la route corrisponderà anche agli URL seguenti:

  • /Product/blah
  • /Product/apple

Poiché l'azione Details() prevede un parametro integer, l'esecuzione di una richiesta contenente qualcosa diverso da un valore integer genererà un errore. Ad esempio, se si digita l'URL /Product/apple nel browser, verrà visualizzata la pagina di errore nella figura 1.

Finestra di dialogo relativa al nuovo progetto

Figura 01: Visualizzazione di una pagina esplosa (Fare clic per visualizzare l'immagine full-size)

Ciò che si vuole fare è solo gli URL corrispondenti che contengono un productId intero appropriato. È possibile usare un vincolo durante la definizione di una route per limitare gli URL corrispondenti alla route. La route product modificata nell'elenco 3 contiene un vincolo di espressione regolare che corrisponde solo agli interi.

Elenco 3 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );

L'espressione regolare \d+ corrisponde a uno o più interi. Questo vincolo determina che la route Product corrisponda agli URL seguenti:

  • /Product/3
  • /Product/89999

Ma non gli URL seguenti:

  • /Product/apple

  • /Prodotto

  • Queste richieste del browser verranno gestite da un'altra route o, se non sono presenti route corrispondenti, verrà restituita una risorsa.