2009-06-21 22 views

Respuesta

2

Puede ¿cambias la 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())); 

El parámetro comodín catchall debe ser el último parámetro.

De lo contrario, creo que tendrá que definir varios parámetros, uno para que coincida con cada sección posible de la URL de TreeMap.

Tenga en cuenta que nunca se pueden definir dos parámetros de enrutamiento juntos sin texto literal entre ellos. En otras palabras, puede definir {Action}/{Id}, pero puede nunca 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.

+0

Supongo que no hay otra manera. {Action}/{id}/{* TreePath} no es una URL muy bonita. Gracias de todos modos –

13

Puede crear un controlador de ruta personalizado para hacer esto. La ruta real es un cajón de sastre:

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

El manejador de árbol se ve en la ruta, los extractos de la última parte como acción, y luego vuelve a dirigir 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 entonces como era de esperar:

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

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

+0

palabra de árbol todavía tiene ruido, gracias de todos modos –

+0

Un controlador de ruta personalizado es definitivamente el camino a seguir si no le gusta el trabajo de womp. No es necesario que el controlador "árbol" se configure explícitamente como lo ha descrito Chris ... Creo que la idea básica es que puede hacer lo que quiera con un manejador de ruta personalizado. – Charlino

1

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 conseguí que funcionara y quise aportar una solución de ejemplo: www.proovit.com/Download/MvcApplication1.zip Es un proyecto MVC estándar simple, dejé el código y los directorios bin, pero puedes copiarlos de un proyecto estándar.

o, tiene que usar la aplicación de etiquetas/bla/bla/bla para el índice y la aplicación/comercio/orden/vista de la página de la orden.

1

Puede tener la parte "codiciosa" dentro de la cadena de consulta siempre que pueda tener partes fijas después de ella, p.

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

Tenga en cuenta que la acción no es variable en las vías anteriores debido a que las partes codiciosos tiene que parar en algún valor literal (que otra barra inclinada). 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. Usted puede encontrar una buena escritura sobre el tema, incluyendo el código here

Cuestiones relacionadas