ASP.NET 4 Beta 1: Métodos de extensión de WebForms Routing
Cuando añadimos el enrutamiento WebForm a ASP.NET 4 Beta 1, no tuvimos la oportunidad de añadir un par de métodos que hacen que trabajar con Rutas y Formas Web sea mucho más fácil!
Nota: el siguiente código es "similar" a lo que estamos añadiendo ASP.NET 4 Beta 2, *Que* código será de calidad mucho más alta, sin embargo, esto es sólo una muestra!
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Web.Routing;
6:
7: public static class RouteExtensions
8: {
9: public static string GetUrlForRoute(this System.Web.UI.Page page, string routeName, RouteValueDictionary parameters)
10: {
11: VirtualPathData vpd= RouteTable.Routes.GetVirtualPath(null, routeName, parameters);
12: return vpd.VirtualPath;
13: }
14: public static string GetUrlForRoute(this System.Web.UI.Page page, RouteValueDictionary parameters)
15: {
16: VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, parameters);
17: return vpd.VirtualPath;
18: }
19:
20: public static void IgnoreRoute(this RouteCollection routes, string url)
21: {
22: routes.IgnoreRoute(url, null);
23: }
24:
25: public static void IgnoreRoute(this RouteCollection routes, string url, object constraints)
26: {
27: if (routes == null)
28: {
29: throw new ArgumentNullException("routes");
30: }
31: if (url == null)
32: {
33: throw new ArgumentNullException("url");
34: }
35: IgnoreRouteInternal internal3 = new IgnoreRouteInternal(url);
36: internal3.Constraints = new RouteValueDictionary(constraints);
37: IgnoreRouteInternal item = internal3;
38: routes.Add(item);
39: }
40:
41: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile)
42: {
43: return routes.MapRoute(name, url, physicalFile, null, null);
44: }
45:
46: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile, object defaults)
47: {
48: return routes.MapRoute(name, url, physicalFile, defaults, null);
49: }
50:
51: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile, string[] namespaces)
52: {
53: return routes.MapRoute(name, url, null, null, namespaces);
54: }
55:
56: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile, object defaults, object constraints)
57: {
58: return routes.MapRoute(name, url, physicalFile, defaults, constraints, null);
59: }
60:
61: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile, object defaults, string[] namespaces)
62: {
63: return routes.MapRoute(name, url, physicalFile, defaults, null, namespaces);
64: }
65:
66: public static Route MapRoute(this RouteCollection routes, string name, string url, string physicalFile, object defaults, object constraints, string[] namespaces)
67: {
68: if (routes == null)
69: {
70: throw new ArgumentNullException("routes");
71: }
72: if (url == null)
73: {
74: throw new ArgumentNullException("url");
75: }
76: if (physicalFile == null)
77: {
78: throw new ArgumentNullException("physicalfile");
79: }
80: Route route2 = new Route(url, new PageRouteHandler(physicalFile));
81: route2.Defaults = new RouteValueDictionary(defaults);
82: route2.Constraints = new RouteValueDictionary(constraints);
83: Route item = route2;
84: if ((namespaces != null) && (namespaces.Length > 0))
85: {
86: item.DataTokens = new RouteValueDictionary();
87: item.DataTokens["Namespaces"] = namespaces;
88: }
89: routes.Add(name, item);
90: return item;
91: }
92:
93: // Nested Types
94: private sealed class IgnoreRouteInternal : Route
95: {
96: // Methods
97: public IgnoreRouteInternal(string url)
98: : base(url, new StopRoutingHandler())
99: {
100: }
101:
102: public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues)
103: {
104: return null;
105: }
106: }
107: }
108:
Entonces, ¿cómo se usan estos métodos?
Estas extensiones añaden algunos métodos simples:
MapRoute
Robado sin vergüenza de MVC. Estos métodos proporcionan un acceso directo a la definición de Rutas para WebForms.
RouteCollection.MapRoute(nombre de la cadena, cadena url, cadena fisicalFile);
Por ejemplo, para mapear una ruta sencilla, ahora puede hacer:
RouteTable.Routes.MapRoute(“ProductDetailsRoute”, “products/”, “~/ProductDetails.aspx”);
También tiene un par de variantes que permiten definir valores predeterminados, etc
RouteCollection.MapRoute(nombre de la cadena, string url, string physicalFile, object defaults);
RouteCollection.MapRoute(nombre de la cadena, string url, string physicalFile, object defaults, string[] espacios de nombres);
GetRouteForUrl
Página.GetUrlForRoute(ruta de cadenaName, parámetros RouteValueDictionary);
El uso de una ruta específicamente nombrada y RouteValueDictionary que contiene una serie de parámetros le dará de vuelta una cadena que contiene el Url a usar. REALMENTE útil en aplicaciones con databound!
por ejemplo,
<asp:hyperlink ID="HyperLink1" runat="server" NavigateUrl='<%# Page.GetUrlForRoute("ProductDetailsRoute",new RouteValueDictionary( new {productid= Eval("ProductID")}))%>' Text="Details"></asp:hyperlink>
Página.GetUrlForRoute(Parámetros de RouteValueDictionary);
Lo mismo, pero auto-compatible los parámetros RouteValueDictionary contra una ruta
IgnorarRute
Le permite definir urls que no deben ser probados para partidos contra rutas (puede ser útil para actualizar aplicaciones WebForms)
RutaColección.IgnorarRuta(url de cuerdas);
RouteCollection.IgnorarRute(string url, restricciones de objetos);