2010-10-21 17 views
1

J'ai le routage suivant dans mon application ...Route correspondant à GetVirtualPath

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

    routes.MapRoute(
    "Branding", 
    "foo/bar.css", 
    new { controller = "DynamicContent", action = "CSS" } 
); 

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

J'utilise Martijn Boland's paging mechanism et il fait finalement l'appel suivant:

var virtualPathData = 
    RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, pageLinkValueDictionary); 

J'ai vérifié que mon contrôleur et l'action dans RequestContext sont valides. Mais une fois cet appel effectué, virtualPathData référence l'URL de foo/bar.css. J'ai vérifié que les URL correspondent au bon contrôleur/action. Si je commente l'itinéraire ci-dessus en laissant la valeur par défaut, l'URL de virtualPathData correspond au bon contrôleur/action.

J'ai aussi essayé la ligne suivante et j'ai le même résultat.

//var virtualPathData = 
    RouteTable.Routes.GetVirtualPathForArea(this.viewContext.RequestContext, pageLinkValueDictionary); 

Quelqu'un peut-il m'aider à comprendre ce que je fais mal?

Répondre

2

Malheureusement, je pense que la logique de génération d'URL ne gère pas très bien les URL statiques. Je crois une chose que vous pouvez faire est:

routes.MapRoute ( "image de marque", "{contrôleur} /bar.css", nouveau {controller = "DynamicContent", action = "CSS"}, new {controller = "foo"} );

Essayez-le.

+0

Merci Phil, ça marche et c'est beaucoup plus propre que ma proposition (qui rétrospectivement ressemble beaucoup à un double négatif) - j'apprécie! – Mayo

1

Je ne sais toujours pas exactement pourquoi je voyais le comportement ci-dessus, donc si quelqu'un veut entrer dans ses idées, n'hésitez pas. Cela dit, si quelqu'un d'autre rencontrait le même problème, je pouvais le contourner en inversant l'ordre de routage avec la route par défaut plus ambiguë ajoutée en premier avec une contrainte NotEqual pour assurer que la route DynamicContent soit atteinte.

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

routes.MapRoute(
    "Branding", 
    "foo/bar.css", 
    new { controller = "DynamicContent", action = "CSS" } 
); 

Pour ceux qui se demandent ce que NotEqual est, je l'ai trouvé on a blog. Je suis certainement prêt à entendre parler de meilleures façons de le faire OU pourquoi mon code original ne fonctionnait pas complètement.