enrutamiento complejo asp.net mvc para la ruta del árbol

Me pregunto cómo puedo definir un mapa de enrutamiento como este:

{TreePath}/{Action}{Id} 

TreeMap se carga dinámicamente desde una base de datos como esta:

  'Gallery/GalleryA/SubGalleryA/View/3' 

Puede crear un controlador de ruta personalizado para hacer esto. La ruta real es un catch-all:

 routes.MapRoute( "Tree", "Tree/{*path}", new { controller = "Tree", action = "Index" }) .RouteHandler = new TreeRouteHandler(); 

El controlador de árbol examina la ruta, extrae la última parte como acción y luego redirige al controlador. La parte de acción también se elimina de la ruta. Agregar la parte {id} debe ser sencillo.

 public class TreeRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { string path = requestContext.RouteData.Values["path"] as string; if (path != null) { int idx = path.LastIndexOf('/'); if (idx >= 0) { string actionName = path.Substring(idx+1); if (actionName.Length > 0) { requestContext.RouteData.Values["action"] = actionName; requestContext.RouteData.Values["path"] = path.Substring(0, idx); } } } return new MvcHandler(requestContext); } } 

Su controlador funciona como lo esperaría:

 public class TreeController : Controller { public ActionResult DoStuff(string path) { ViewData["path"] = path; return View("Index"); } } 

Ahora puede llamar a URL como /Tree/Node1/Node2/Node3/DoStuff . La ruta que obtiene la acción es Node1/Node2/Node3

¿Puedes cambiar las URL? Si puede hacer que su parámetro {TreePath} sea el último parámetro, puede hacerlo fácilmente con una ruta.

  routes.MapRoute("TreeRoute", "{Action}/{id}/{*TreePath}", new TreeRouteHandler())); 

Sin embargo, el parámetro comodín catchall debe ser el último parámetro.

De lo contrario, creo que se verá obligado a tener que definir múltiples parámetros, uno para que coincida con cada sección posible de la URL de TreeMap.

Tenga en cuenta que nunca puede definir dos parámetros de enrutamiento juntos sin algún texto literal entre ellos. En otras palabras, puede definir {Action}/{Id} , pero nunca puede definir {Action}{Id} . No hay forma de que el motor de enrutamiento sepa dónde termina un parámetro y el siguiente comienza cuando coinciden los patrones.

Soy nuevo en MVC, pero uno de los requisitos era esta opción. Soy un vb-er, así que tuve algunos problemas para convertir el código, pero lo hice funcionar y quería aportar una solución de ejemplo: http://www.proovit.com/Download/MvcApplication1.zip Es un proyecto MVC estándar simple, dejé el código y el bin se descargan, pero puede copiarlos de un proyecto estándar.

o, tiene que usar la aplicación de tags / bla / bla / bla para el índice y la aplicación / trade / order / view para la página de la orden.

Puede tener la parte “codiciosa” dentro de la cadena de consulta siempre que pueda tener partes fijas después, por ejemplo

 /{*TreePath}/Edit/{id} /{*TreePath}/Action/{id} 

Tenga en cuenta que la acción no es variable en las rutas anteriores porque las partes codiciosas deben detenerse en algún valor literal (que no sea la barra diagonal). Trabajaré si solo realizas algunas acciones en tu “árbol”, pero será engorroso si tienes muchas acciones ya que cada una necesitará su propia entrada de ruta.

No funcionará de la caja, pero requiere una ruta personalizada. Puede encontrar una buena escritura sobre el tema, incluyendo el código aquí