Crear una restricción de ruta (C#)
por Stephen Walther
En este tutorial, Stephen Walther demuestra cómo puede controlar la forma en que las solicitudes de los exploradores hacen coincidir las rutas mediante la creación de restricciones de ruta con expresiones regulares.
Las restricciones de ruta se usan para restringir las solicitudes del explorador que coinciden con una ruta determinada. Puede usar una expresión regular para especificar una restricción de ruta.
Por ejemplo, imagine que ha definido la ruta en la lista 1 del archivo Global.asax.
Lista 1: Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"}
);
La lista 1 contiene una ruta denominada Product. Puede usar la ruta Product para asignar solicitudes del explorador al ProductController incluido en la lista 2.
Lista 2: Controllers\ProductController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
public ActionResult Details(int productId)
{
return View();
}
}
}
Observe que la acción Details() expuesta por el controlador de producto acepta un único parámetro denominado productId. Este parámetro es un parámetro entero.
La ruta definida en la lista 1 coincidirá con cualquiera de las siguientes direcciones URL:
- /Product/23
- /Product/7
Desafortunadamente, la ruta también coincidirá con las siguientes direcciones URL:
- /Product/blah
- /Product/apple
Dado que la acción Details() espera un parámetro entero, la realización de una solicitud que contenga algo distinto de un valor entero provocará un error. Por ejemplo, si escribe la dirección URL /Product/apple en el explorador, obtendrá la página de error de la figura 1.
Figura 01: Ver una explosión de página (haga clic para ver la imagen de tamaño completo)
Lo que realmente quiere hacer es solo coincidir con las URL que contengan un productId entero correcto. Puede usar una restricción al definir una ruta para restringir las direcciones URL que coinciden con la ruta. La ruta Product modificada de la lista 3 contiene una restricción de expresión regular que solo coincide con enteros.
Lista 3: Global.asax.cs
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"},
new {productId = @"\d+" }
);
La expresión regular \d+ coincide con uno o varios enteros. Esta restricción hace que la ruta Product coincida con las siguientes direcciones URL:
- /Product/3
- /Product/8999
Pero no las siguientes direcciones URL:
/Product/apple
/Product
Estas solicitudes del explorador se controlarán mediante otra ruta o, si no hay rutas coincidentes, se devolverá un error El recurso no se encontró.