Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

URL Routing v ASP.NET – část první

10.56 - 7. září 2008 | Webdesign

První vlašťovkou z hnízda MVC frameworku, která se objevila v produkční verzi .net frameworku, je knihovna System.Web.Routing. Objevila se s příchodem SP1 verze 3.5 a to proto, že jí využívají ASP.NET Dynamic Data, které jsou taktéž novinkou service packu. No a protože routing je důležitou součástí ASP.NET MVC a jeho výhod lze využít i v klasickém ASP.NET, pojďme se na něj podívat trochu blíž.

Jak to funguje

Základem routingu je HttpModul, který vezme URL adresu požadavku a snaží se ho napárovat na některou z rout, které se registrují při startu aplikace. Pokud najde, získá z adresy požadované parametry a předá zpracování patřičnému RouteHandleru, který má za úkol vytvořit HttpHandler a předat mu získaná data. V případě MVC se vytvoří MvcHttpHandler a data se přidávají kontextu, v klasickém ASP.NET je to jen na vás.

Routovací handler pro WebForms může vypadat třeba následovně:

public class WebFormRouteHandler<T> : IRouteHandler where T : IHttpHandler, new() {
  public string VirtualPath { get; set; }

  public WebFormRouteHandler(string virtualPath) {
    VirtualPath = virtualPath;
  }
  public IHttpHandler GetHttpHandler( RequestContext requestContext ) {
    foreach (var value in requestContext.RouteData.Values) {
      requestContext.HttpContext.Items[value.Key] = value.Value;
    }

    return (VirtualPath != null)
      ? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
      : new T();
  }
}

Routovací handler projde kolekci dat získaných z aktuální URL požadavku, nacpe je do kontextu a nakonec vytvoří a vrátí IHttpHandler.

Routovací tabulky

Pro naše aplikace je asi nejdůležitější nadefinovat routovací tabulky. Definice tabulky se vytváří při startu aplikace, tudíž využijeme události Application_Start v Global.asax nebo vlastním HttpModulu.

public class MvcApplication : System.Web.HttpApplication {
  public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );
  }
  protected void Application_Start() {
    RegisterRoutes(RouteTable.Routes);
  }
}

Ukázka tvorby routovací tabulky při startu webové aplikace. Metoda MapRoute je extension metodou z MVC frameworku, která za nás vytvoří MvcHttpHandler, který bude požadavek zpracovávat. Získané parametry z routy jsou: název řadiče, který přebere řízení, jeho akce, která požadavek zpracuje a dále pak parametr id.

U WebForms by routovací tabulka např. pro můj blog mohla vypadat následovně:

public class Global : System.Web.HttpApplication {
  public static void RegisterRoutes(RouteCollection routes) {
    var routeHandler = new WebFormRouteHandler<Page>("~/Weblog/Article.aspx");
    var route = new Route("weblog/{id}-{url}.aspx", routeHandler) {
      Constraints = new RouteValueDictionary {
       {"id", "\d{1-3}"}
     }
    };
    routes.Add(route);
  }
  protected void Application_Start(object sender, EventArgs e) {
    RegisterRoutes(RouteTable.Routes);
  }
}

Zaregistroval jsem do tabulky routu, která bere URL ve tvaru weblog/{id}-{url}.aspx a ověřuje se, že id je jedno až tříciferné číslo.

Shrnutí

„Pane Aloisi, když dovolíte, já bych si to v závěru celé shrnul.“

„Tak, jestli vám to udělá dobře, tak si to celý schrntě.“

Tak tedy, tento spotík se snažil nastínit jak funguje routing v ASP.NET, jak si zaregistrovat routy a jak z nich získávat data. Mohlo by se zdát, že to je vše čeho jsme schopní dosáhnout, ale není tomu tak. Routing je v ASP.NET dvoucestný, ale cestu zpět si ukážeme zas někdy příště… Třeba na WebExpu!

Tagy: , ,

Autor: Aleš Roubíček | Přidej komentář | Delicious | Digg | FriendFeed | Facebook | Linkuj! | Jagg

Komentáře RSS

  1.  

    Michal

    13.38 - 7. září 2008 | #

    URL Routing povazuji za jedinou uzitecnou vec z MVC frameworku. MVC framework je vice modni, nez uzitecna vec.

    PS: Doufam, ze prednasku stihnu. Zatim to vypada dobre ;-)

  2.  

    Ondra

    13.32 - 8. září 2008 | #

    A jaká je výhoda oproti přepisování url nebo IHttpHandlerFac­tory?

  3.  

    SpinGee

    13.06 - 13. března 2009 | #

    Proc pouzivas tu silenou syntaxi z javy, slozeny zavorky znacici zacatek a konec bloku musej bejt pod sebou jinak neni vubec videt kde jakej blok zacina a konci, fuj .

  4.  

    Aleš Roubíček

    13.23 - 13. března 2009 | #

    [3] SpinGee: Ještě jsi zapoměl na dvoj mezerové odsazení.

    Sorry, ale je to coding style, na který jsem zvyklý a navíc na blogu působí o dost kompaktněji. Tudíž je pro ukázky zdrojáků lepší…

  5.  

    SpinGee

    13.58 - 13. března 2009 | #

    [4] Aleš Roubíček: Ja nevim tenhle styl proste nesedi, hur se v tom vyznavam, to co tu mas jeste treba jde ale kdyz je to nejaka slozitejsi funkce tak si to musim hodit do visual studia a preformatovat­.Hlavne javascripty sou tak psany, ale tam to chapu protoze se tim snazi usetrit velikost souboru(stejne se to pak prevede do toho „komprimovanyho“ stylu takze je to vlastne jedno…).

Místo pro tvůj názor

Povinné je jméno a komentář, z e-mailu se rozpoznají Gravatary.
Komentář je formátován pomocí Texy! syntaxu.
Například: **tučný text**, *kurzíva*, "text odkazu":adresa.
Internetové adresy jsou převáděny na odkazy.
Na komentáře se můžete odkazovat pomocí [číslo komentáře].

Nový komentář