routeconfig route net mvc examples attribute asp asp.net routing depth-first-search

asp.net - mvc - route attribute asp net core



Enrutamiento anidado en primer lugar en un sitio web ASP.NET (1)

He estado explorando el espacio de nombres de System.Web.Routing , jugando con restricciones y demás, pero no veo una manera de implementar esto.

Estoy trabajando en un sitio web ASP.NET ( no WAP, no MVC ) usando el framework WebPages / Razor.

Estoy tratando de implementar una forma de "enrutamiento anidado", donde una ruta puede contener rutas secundarias que solo se intentan si el padre coincide; cada niño intenta igualar el "resto" del URI. Una búsqueda de coincidencia de rutas "primero en profundidad", si lo desea.

routes.Add(new ParentRoute("{foo}/{*remainder}", new[] { new ParentRoute("{bar}/{*remainder}", new[] { new Route("{baz}"), new Route("{zip}"), }), new ParentRoute("{qux}/{*remainder}", new[] { new Route("{baz}"), new Route("{zip}"), }), ));

He excluido restricciones / controladores necesarios ( entre otros parámetros ) por brevedad.

En cualquier caso, cada paso que desciende por el árbol coincidiría con la cola {*remainder} del URI. Si una rama falla, se mueve hacia arriba y hacia adelante, esencialmente probando algo como:

foo foo/bar foo/bar/baz foo/bar/zip foo/qux foo/qux/baz foo/qux/zip

Ahora, ciertamente no estoy pidiendo "por favor, escriba el código", sino un gesto en la dirección correcta.

¿Dónde quisiera buscar en la API para comenzar a implementar dicha función? Puedo encontrar innumerables tutoriales e información sobre cómo escribir rutas, restricciones, etc., pero no sobre extender el motor de enrutamiento.

Apéndice
Voy a seguir agregando como garantías

  1. Tenga en cuenta que soy consciente de que la generación de URL a partir de un "árbol de enrutamiento" como este sería complicado; no es algo que pretendo implementar.

  2. Me acabo de dar cuenta de que un tipo de generación iterativa de rutas podría ser suficiente; así que supongo que publicaré eso como una posible respuesta en breve. No, no lo haría. Demasiados casos extremos.


Tengo el siguiente código, pero hay un punto en el que no estoy seguro de cómo quieres manejarlo: ¿sabes cuántos niños pueden tener una ruta al máximo?

En Global.asax:

public static void RegisterRoutes(RouteCollection routes) { routes.Add(new Route("test/{path}", new RouteValueDictionary { { "path", string.Empty } }, new TestingRouteHandler())); }

La clase TestingRoutHandler:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Routing; using System.Web; using System.Web.UI; using System.Web.Compilation; namespace WebApplication1 { class TestingRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { //This is where you should treat the request, test if the file exists and if not, use the parent part of the url string aspxFileName = string.Format("~/{0}.aspx", requestContext.HttpContext.Request.Url.PathAndQuery.Replace("/", string.Empty)); return (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(aspxFileName, typeof(Page)) as Page; } } }