Dneska se chci věnovat nové vlastnosti .NET Frameworku 4 pro Web Formové aplikace a to URL Routingu. Co to vlastně je? URL routing je technika, díky které má uživatel k dispozici takzvané hezké url adresy stránek (např. http://www.mujweb.cz/product/156) a vývojář spoustu starostí. Nicméně je nutno říci, že díky URL Routingu to již není takový problém ve srovnání se psaním vlastního http modulu. Tak tedy směle do toho.
Vlastní URL routing by se dal rozdělit do tří částí, respektive do tří ohraničených problémů. Jsou to: Mapování stránek, čtení parametrů na těchto stránkách a vytváření odkazů na spravované stránky. Postupně se na všechny tyto případy podíváme.
Mapování stránek
Pod tímto si můžeme představit vytváření routovací tabulky, díky které se překládají hezké url adresy na interní url adresy. Tedy již zmiňovaná adresa http://www.mujweb.cz/product/156 by jako interní adresa vypadala takto http://www.mujweb.cz/product.aspx?IDproduct=156. Tyto pravidla patří do souboru Global.asax a to do metody Application_Start.
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute(
"Home",
"home",
"~/Default.aspx");
RouteTable.Routes.MapPageRoute(
"About",
"about",
"~/About.aspx");
RouteTable.Routes.MapPageRoute(
"Product",
"product/{IDproduct}",
"~/Product.aspx");
RouteTable.Routes.MapPageRoute(
"Detail",
"detail/{IDproduct}/{IDtype}",
"~/Detail.aspx");
RouteTable.Routes.MapPageRoute(
"GuestBook",
"guestbook/{IDuser}/{Date}",
"~/GuestBook.aspx",
true,
new RouteValueDictionary { {"Date", DateTime.Now}});
RouteTable.Routes.MapPageRoute(
"GuestBookRestrict",
"guestbookrestrict/{IDuser}/{Date}",
"~/GuestBook.aspx",
true,
new RouteValueDictionary { { "Date", DateTime.Now } },
new RouteValueDictionary { { "IDuser", @"\d+" }, { "Date", @".+" } });
//Zakážeme rotování systémových zdrojů
RouteTable.Routes.Ignore(
"{resource}.axd/{*pathInfo}");
}
Tato routovací tabulka vypadá poněkud nepřehledně, ale pokud se na tyto pravidla podíváme z blízka, zjistíme, že to nebude tak hrozné. První pravidlo, které se jmenuje “Home”, říká že pokud je url adresa http://www.mujweb.cz/home tak přesměruj na stránku http://www.mujweb.cz/Default.aspx. Což je jednoduché a přehledné. Druhé pravidlo “About” se chová podobně, ale zato třetí pravidlo “Product” je již zajímavější. Ve třetím pravidle se již pracuje s parametry a to takto: pokud je url adresa http://www.mujweb.cz/produkt/111 tak přesměruj na stránku http://www.mujweb.cz/Product.aspx?IDproduct=111. Stejné problematice se věnuje i čtvrté pravidlo “Detail” s tím rozdílem, že dokáže obsloužit více parametrů. Zase o něco zajímavější je páté pravidlo “GuestBook”, ve kterém se parametru Date nastavuje výchozí hodnota a to aktuální datum. Takže pokud je parametr uveden v adrese je použit, jinak se použije výchozí hodnota. A nejzajímavější je pravidlo předposlední “GuestBookRestrict”, které ke všem předchozím funkcí ještě umožňuje testovat hodnotu parametru za pomoci regulárního výrazu. Pokud parametr nesplňuje pravidla, toto přesměrování se neprovede a skončíme na hlášení, že stránka neexistuje. Poslední pravidlo na rozdíl od předchozích umožňuje ignorovat definovanou adresu. v příkladu je vidět, ignorace všeho co končí příponou axd a za touto příponou může být cokoliv, což symbolizuje ona hvězdička. Závěrem tohoto bloku bych snad jen upozornil na to, že pravidla se nastavují metodou MapPageRoute nikoliv Add ačkoliv to k tomu svádí!
Čtení parametrů
Druhým problémkem je ve stránce, na kterou jsme uživatele pomocí interní url přesměrovali, přečíst parametry. Zase se zde dá říci, že to není nic složitého. Způsoby jak to udělat jsou dva, a to v obslužném kódu stránky, nebo přímo ve stránce deklarativně. V obslužném kódu stránky máme od verze Frameworku 4 k dispozici nový objekt RouteData, což je objekt umístěný v namespacu System.Web.Routing a je také vlastností objektu Page. Použití si ukážeme na příkladu kdy parametr IDproduct uložíme do proměnné MyIDproduct.
int MyProdukt = (int)RouteData.Values["IDproduct"];
Přičemž vlastnost Values obsahuje kolekci url parametrů. Druhým způsobem výpisu parametrů je již zmiňovaný deklarativní zápis.
<%$ RouteValue:IDproduct %>
Vytváření odkazů
A jsme u posledního úkolu a to je vytvořit nějak inteligentně odkazy ve stránkách tak, aby se odkazovaly na naše hezká url. Jistě by někoho mohlo napadnout si tyto odkazy prostě sestrojit řekněme běžným způsobem, ale toto asi není úplně to, co bychom si přestavili pod termínem inteligentní řešení. Super by bylo říct jaký odkaz chceme vytvořit, respektive dle jakého routovacího pravidla chceme vytvořit odkaz obsahující hezké url a případně dodat nějaké ty parametry. A přesně takto to funguje. Jednoduchý odkaz bez parametrů vypadá následovně:
string MyNiceURL = GetRouteUrl("Home", null);
Výsledkem našeho snažení bude url adresa http://www.mujweb.cz/home. Pokud zatoužíme mít v url adrese i nějaké ty parametry, tak máme k dispozici několik způsobů jak to udělat. Jedním způsobem je nahrazení parametru null z předchozího příkladu za ony parametry:
string MyNiceURL = GetRouteUrl(
"Home",
new { IDproduct=200 });
případně více parametrů:
string MyNiceURL = GetRouteUrl(
"Home",
new { IDproduct=200, IDtype = 1 });
Nebo to jde i o maličko složitěji:
RouteValueDictionary DalsiParametry =
new RouteValueDictionary
{
{ "IDproduct", "400" },
{ "IDtype", "2" }
};
VirtualPathData DalsiVirtualniAdresa = RouteTable.Routes.GetVirtualPath(
null,
"Detail",
DalsiParametry);
string MyNiceURL = DalsiVirtualniAdresa.VirtualPath;
Závěr
A to je vše co potřebujeme vědět k tomu, abychom mohli úspěšně routovat url adresy. Pokud by tento tahák nestačil, více informací o tomto tématu naleznete jako vždy na MSDN.
Ještě dodám jednu informaci na kterou jsem již stačil přijít v praxi. Při změně NET Frameworku z 3.5 na 4 a následném pokusu o URL Routing to jaksi nefungovalo. Vše začalo fungovat až s tímto nastavením webserveru:
<system.webserver>
<modules runallmanagedmodulesforallrequests="true" />
</system.webserver>
Příklad jednoduchého webu s routováním url adres je ke stažení zde.