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
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 –