2009-06-21 12 views

Répondre

2

Can vous passez l'URL autour? Si vous pouvez définir votre paramètre {TreePath} comme dernier paramètre, vous pouvez facilement le faire avec un itinéraire.

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

Le paramètre catchall générique doit cependant être le dernier paramètre. Sinon, je pense que vous serez obligé de définir plusieurs paramètres, un pour correspondre à chaque section possible de l'URL TreeMap.

Notez que vous ne pouvez jamais définir deux paramètres de routage ensemble sans un texte littéral entre eux. En d'autres termes, vous pouvez définir {Action}/{Id}, mais vous pouvez jamais définir {Action}{Id}. Le moteur de routage n'a aucun moyen de savoir où se termine un paramètre et le suivant commence lors de la correspondance de modèle.

+0

Je suppose qu'il n'y a pas d'autre moyen. {Action}/{id}/{* TreePath} n'est pas une très belle URL. Merci quand même –

13

Vous pouvez créer un gestionnaire de routage personnalisé pour cela. La route actuelle est un fourre-tout:

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

Le gestionnaire d'arbre regarde chemin, extrait la dernière partie que l'action, et redirige ensuite au contrôleur. La partie action est également supprimée du chemin. L'ajout de la partie {id} devrait être simple.

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); 
    } 
} 

Votre contrôleur fonctionne alors comme vous attendre:

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

Maintenant, vous pouvez appeler l'URL comme /Tree/Node1/Node2/Node3/DoStuff. Le chemin que l'action obtient est Node1/Node2/Node3

+0

mot de l'arbre a encore du bruit, Merci quand même –

+0

Un gestionnaire de route personnalisé est certainement le chemin à parcourir si vous n'aimez pas le travail de womp. Vous n'avez pas besoin d'avoir le contrôleur "tree" explicitement défini comme Chris l'a souligné ... Je pense que l'idée de base est que vous pouvez faire tout ce que vous voulez avec un gestionnaire de routage personnalisé. – Charlino

1

Je suis nouveau à MVC, mais l'une des exigences était cette option. Je suis un vb-er, donc j'ai eu quelques problèmes de conversion de code, mais je l'ai eu pour travailler un exemple de solution: www.proovit.com/Download/MvcApplication1.zip C'est un simple projet MVC standard, j'ai laissé le code et bin dirs, mais vous pouvez les copier à partir d'un projet standard.

o, vous devez utiliser les balises app/bla/bla/bla pour l'index et app/trade/order/view pour la page de commande.

1

Vous pouvez avoir la partie "gourmande" dans la chaîne de requête tant que vous pouvez avoir des parties fixes après elle, par ex.

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

Notez que l'action n'est pas variable dans les routes ci-dessus parce que les parties avides doit arrêter à une valeur littérale (autre que barre oblique). Je vais travailler si vous n'effectuez que quelques actions sur votre "arbre", mais cela sera encombrant si vous avez beaucoup d'actions car chacune aura besoin de sa propre entrée de route.

Cela ne fonctionnera pas immédiatement, mais nécessite un itinéraire personnalisé. Vous pouvez trouver une belle écriture sur le sujet, y compris le code here