Vytvoření omezení trasy (C#)

Stephen Walther

V tomto kurzu Stephen Walther ukazuje, jak můžete řídit, jak žádosti prohlížeče odpovídají trasám vytvořením omezení tras s regulárními výrazy.

Omezení trasy můžete použít k omezení požadavků prohlížeče, které odpovídají konkrétní trase. K určení omezení trasy můžete použít regulární výraz.

Představte si například, že jste definovali trasu ve výpisu 1 v souboru Global.asax.

Výpis 1 – Global.asax.cs

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

Výpis 1 obsahuje trasu s názvem Product. Pomocí trasy Product můžete namapovat požadavky prohlížeče na ProductController obsažený ve výpisu 2.

Výpis 2 – Controllers\ProductController.cs

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

Všimněte si, že akce Details() vystavená kontrolerem produktu přijímá jediný parametr s názvem productId. Tento parametr je celočíselný parametr.

Trasa definovaná v seznamu 1 se bude shodovat s některou z následujících adres URL:

  • /Produkt/23
  • /Produkt/7

Trasa se bohužel bude shodovat také s následujícími adresami URL:

  • /Produkt/bla
  • /Product/apple

Vzhledem k tomu, že akce Details() očekává celočíselný parametr, způsobí vytvoření požadavku, který obsahuje něco jiného než celočíselnou hodnotu, chybu. Pokud například do prohlížeče zadáte adresu URL /Product/apple, zobrazí se chybová stránka na obrázku 1.

Dialogové okno New Project (Nový projekt)

Obrázek 01: Zobrazení exploze stránky (kliknutím zobrazíte obrázek v plné velikosti)

To, co opravdu chcete udělat, je pouze shoda s adresami URL, které obsahují správné celé číslo productId. Omezení můžete použít při definování trasy k omezení adres URL, které odpovídají dané trase. Upravená trasa Product v seznamu 3 obsahuje omezení regulárního výrazu, které odpovídá pouze celá čísla.

Výpis 3 – Global.asax.cs

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

Regulární výraz \d+ se shoduje s jedním nebo více celými čísly. Toto omezení způsobí, že trasa produktu bude odpovídat následujícím adresám URL:

  • /Produkt/3
  • /Produkt/8999

Ale ne následující adresy URL:

  • /Product/apple

  • /Produktu

  • Tyto požadavky prohlížeče budou zpracovány jinou trasou, nebo pokud neexistují žádné odpovídající trasy, vrátí se chyba Prostředek se nepodařilo najít .