2009-01-04 9 views
5

Je suis essayer de comprendre comment gérer le scénario suivant. En général, j'ai un tas d'enregistrements dans une table. Tous ont des champs ID et ParentID pour former un arbre.Routage page/sous-page ASP.NET MVC

Page1 
- Page2 
- Page3 
Page4 
- Page5 
-- Page6 

Maintenant, je veux que mes itinéraires pour Page3 et Page6 à être comme /Page1/Page6 et /Page3/Page5/Page6 respectivelly. C'est, je veux inclure tous les parents dans l'URL.

Comment régler l'action/le routage de mon contrôleur pour obtenir le résultat ci-dessus?

Edit: Vous avez oublié de mentionner que la structure ci-dessus sera dynamique - les noeuds peuvent être ajoutés/supprimés/parent du changement, etc.

+0

Jetez un oeil à [cette] (http://stackoverflow.com/questions/296284/mvc-dynamic-routes) >> http://stackoverflow.com/questions/296284/mvc-dynamic- routes – Mark79

Répondre

3

Vous pouvez utiliser un match générique, voir: http://www.vergentsoftware.com/blogs/ckinsman/ASPNETMVCWildcardRoutes.aspx

Un itinéraire possible:

routes.MapRoute("SomeName", "{*Page}", new { controller = "ControllerName", action = "ActionName" }); 

et dans l'action acceptent la chaîne page et analyser manuellement, peut-être avec une scission?

edit: cela pourrait aussi être utile: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

+1

Merci, beaucoup aidé. J'ai sauvé mon temps. –

+0

@MichaelSamteladze np, c'était il y a près de huit ans :) – ccook

0

Notez que le nom du contrôleur et l'action sont fixes et ne reposent pas sur l'URL.

// place the more specific route first 
routes.MapRoute("r1", "{parent}/{child}/{subchild}", 
    new { controller = "Page", action = "Index", parent = parent, child = child, subchild = subchild }); 

routes.MapRoute("r2", "{parent}/{child}", 
    new { controller = "Page", action = "Index", parent = parent, child = child }); 


public class PageController 
{ 
    public ActionResult Index(string parent, string child, string? subchild) 
    { 
     // stuff 
    } 
}