|
|
Vývoj webových aplikací ASP.NET
.NET Framework 3.5 SP1 přináší alternativní přístup k URL Rewritingu - tzv. ASP.NET Routing, ve zkratce:
- jde o modul System.Web.Routing.UrlRoutingModule a související třídy, vše z assembly System.Web.Routing (novinka v SP1 k .NET 3.5),
- modul pracuje nad globální routovací tabulkou (RouteTable), v které je uložena uspořádaná kolekce Routes (v podstatě seznam postupně vyhodnocovaných pravidel - instancí třídy Route, resp. potomků RouteBase)
- pravidlo v kolekci Routes může mít název, na který se pak dá odkazovat při zpětném sestavování URL,
- pro každé pravidlo (pattern cesty) je v kolekci uložen odkaz na IRouteHandler, který má daný request obsloužit (IRouteHandler předepisuje jedinou metodu GetHttpHandler(), která vrací příslušný IHttpHandler pro odbavení requestu)
- ASP.NET routing nedělá "rewriting", tedy nevymění surově za běhu requestu ASP.NETu cestu, ale jde o čisté řešení používající přímo nasměrování na odpovídající HttpHandler
- routovací tabulku lze využít (a je to zásadní výhoda ASP.NET routingu) i ke zpětné rekonstrukci URL a tedy lze udělat čistě routing obousměrný (adresu veškerých odkazů a redirectů v aplikaci zjišťuji z routingu metodou GetVirtualPath).
Jak tedy implementovat ASP.NET Routing pro WebForms (původně byl zamýšlen především pro MVC, používá ho i Dynamic Data):
- Nareferencujeme assembly System.Web.Routing (ve VS přes References, popř. ve web.configu do system.web/compilation/assemblies.
- V příslušné částí web.configu (dle verze IIS system.web/httpModules, nebo system.webServer/modules) zapojíme do hry modul UrlRoutingModule:
<add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
- Vytvoříme routovací tabulku (typicky z Application_Start v global.asax)
private void Application_Start() { RegisterRoutes(RouteTable.Routes); }
public static void RegisterRoutes(RouteCollection routeCollection) { routeCollection.Add("Test", new Route("test/{MyParam}", new MyRouteHandler("~/MyFolder/Page.aspx"))); }
- v patternu pro routu dáváme parametry do složených závorek {parametr} - parametry od sebe musí být oddělený textovou konstatnou, typicky lomítkem /, ale třeba i {language}-{country}/{something} pro cs-CZ/test - na konci patternu můžeme použít hvězdičkový parametr {*parametr}, který požere veškerý zbývající text do konce řetězce (vstupního URL) - případné další parsování tohoto parametru je už na nás - připomínám, že pravidla se vyhodnocují v pořadí v jakém jsou v kolekci a uplatní se první vyhovující pravidlo (není tedy dobré začínat {*myParam}, dál už se nedostanete)
- Vytvoříme třídu implementující IRouteHandler, která bude requesty obsluhovat, v případě WebForms vracíme regulérní IHttpHandler (potomek Page) odpovídající potřebné připravené stránce, která má request obsloužit
public class MyRouteHandler : IRouteHandler { private string _targetVirtualPath;
#region Constructor public MyRouteHandler(string targetVirtualPath) { _targetVirtualPath = targetVirtualPath; } #endregion
#region GetHttpHandler /// <summary> /// Provides the object that processes the request. /// </summary> /// <param name="requestContext">An object that encapsulates information about the request.</param> /// <returns>An object that processes the request.</returns> public IHttpHandler GetHttpHandler(RequestContext requestContext) { // zkopírování parametrů z route do HttpContext.Items foreach (var urlParm in requestContext.RouteData.Values) { requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value; } return BuildManager.CreateInstanceFromVirtualPath(_targetVirtualPath, typeof(Page)) as IHttpHandler; } #endregion }
- Část kódu v metodě GetHttpHandler ukazuje vyzvednutí parametrů zjištěných z routy a možný způsob jejich předání do stránky (přes kolekci Items HttpContextu).
- Ve stránce pak můžeme na takto předané parametry přistupovat
TestLb.Text = HttpContext.Current.Items["MyParam"].ToString();
- A pokud bychom chtěli zkonstruovat URL stránky na základě pravidel v RouteTable použijeme např.
Response.Redirect(RouteTable.Routes.GetVirtualPath(null, "Test", new RouteValueDictionary() { {"MyParam", "hodnota"} }).VirtualPath);...chceme URL od routy Test při použití parametrů MyParam=hodnota. Pokud bychom název cesty nezadali, najde routing sám první routu, která předané parametry používá.
Routingu se ještě dá nastavit spousta dalších věcí:
- defaultní hodnoty parametrů pro každou routu,
- constrainty na jednotlivé parametry routy (regulárním výrazem, nebo i vlastním kódem vracejícím boolean),
- jestli má reflektovat requesty na fyzicky existující soubory (třeba /Default.aspx), nebo jestli má požírat vše a řídit se výhradně definovanými routami,
- ...a pár dalších věcí.
Je potřeba si dát pozor zejména na:
- autorizaci - běžná autorizace (web.config, element authorization) nastavená na fyzické soubory se při routingu neuplatní, cesta je totiž jiná, museli bychom nastavit elementy location na nové cesty, ale ztratíme tím výhodu jediného místa s definicí URL (routovací tabulky) - doporučuje se autorizaci řešit z kódu,
- relativní cesty (např. k obrázkům, stylům, atp.)
Viz též:
Doporučené zdroje:
Comment Notification
If you would like to receive an email when updates are made to this post, please register here
Subscribe to this post's comments using
|
|
|