URL Routing v ASP.NET – část první
|
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ě.“
http://www.youtube.com/watch?…
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: ASP.NET, ASP.NET MVC, Routing
Okomentováno