2011-10-07 3 views
0

J'ai écrit un blog en tant que projet d'apprentissage depuis un moment et je viens de réécrire ma structure d'URL afin d'améliorer l'organisation de mes contrôleurs. Cela s'est plutôt bien passé, mais j'ai un petit problème avec une route conflictuelle.ASP.NET MVC 3: Résoudre un conflit d'itinéraire

Je suis en train de configurer ma structure d'URL comme suit:

/ 
/page/2 
/category 
/category/page/2 

Les catégories sont stockées dans la base de données. Cela fonctionne bien pour le moment, mais je viens de remarquer que lorsque j'essaie de revenir à la page d'accueil, je frappe plutôt /page.

Voici mon tableau en cours de route:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Admin", 
     "admin", 
     new { controller = "Admin", action = "Index" } 
    ); 

    routes.MapRoute(
     "ShowPagedPostsByCategory", 
     "{category}/page/{page}", 
     new { controller = "Posts", action = "Index", page = UrlParameter.Optional }, 
     new { page = @"(\d+)?" } 
    ); 

    routes.MapRoute(
     "ShowPagedPosts", 
     "page/{page}", 
     new { controller = "Posts", action = "Index", page = UrlParameter.Optional }, 
     new { page = @"(\d+)?" } 
    ); 

    routes.MapRoute(
     "ShowPostsByCategory", 
     "{category}", 
     new { controller = "Posts", action = "Index" } 
    ); 

    routes.MapRoute(
     "ShowTaggedPosts", 
     "posts/tagged/{tag}", 
     new { controller = "Posts", action = "ShowTaggedPosts", tag = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     "EditDeleteComment", 
     "posts/{action}/{id}", 
     new { controller = "Posts" }, 
     new { action = @"EditComment|DeleteComment", id = @"\d+" } 
    ); 

    routes.MapRoute(
     "AddComment", 
     "{controller}/comment", 
     new { controller = "Posts", action = "Comment" } 
    ); 

    routes.MapRoute(
     "ShowPost", 
     "{controller}/{PostID}/{*slug}", 
     new { controller = "Posts", action = "ShowPost", slug = UrlParameter.Optional }, 
     new { PostID = @"\d+" } 
    ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Posts", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

je peux voir ce que le problème est: l'URL de la maison de «/» est correspondant à l'itinéraire de ShowPagedPosts, mais le déplacement qui en dessous de la voie par défaut semble être la mauvaise chose à faire. Cela me fait penser que mon approche est un peu délaissée. Quelqu'un peut-il me diriger dans la bonne direction s'il vous plaît?

Modifier: En fait, avec RouteDebugger, je vois qu'il correspond réellement aux routes ShowPagedPosts et ShowPostsByCategory.

Répondre

2

Lors de l'utilisation de Html.ActionLink, la première route correspondante sera utilisée.

Si vous souhaitez utiliser un autre itinéraire spécifique, utilisez Html.RouteLink qui prend le nom de l'itinéraire en tant que paramètre.

+0

merci pour la réponse. Votre suggestion ressemble à ce que je veux, mais je n'arrive pas à le faire fonctionner. J'ai un lien sur ma page '/ admin' que je veux aller à la page d'accueil. J'ai essayé d'utiliser '@ Html.RouteLink (" Test "," Default ")' pour correspondre à ma route par défaut, mais bien que ce soit le rendu, le href est vide, donc ça me ramène à '/ admin' . Mes paramètres correspondent à la signature de la méthode, donc je ne suis pas sûr de ce qui se passe. –

+0

OK, il semble que ce soit un léger problème avec 'Html.RouteLink' (et aussi' Url.RouteUrl'). Trouvé et résolu le problème de l'article de Scott Gu [ici] (http://weblogs.asp.net/scottgu/archive/2008/04/16/asp-net-mvc-source-refresh-preview.aspx). Merci pour l'aide, Arjan. :) –