2008-11-01 9 views
11

Je souhaite créer un itinéraire MVC pour une liste de nouvelles pouvant être diffusées dans plusieurs formats.Routes ASP.NET MVC avec "Extensions de fichier"

  • nouvelles -> (X) HTML
  • news.rss -> RSS
  • news.atom -> ATOM

Est-il possible de le faire (la « extension optionnelle plus générale "la situation surgit dans plusieurs endroits dans ma conception prévue) avec une route? Ou dois-je faire deux itinéraires comme ceci:

routes.MapRoute("News-ImplicitFormat", 
       "news", 
       new { controller = "News", action = "Browse", format = "" }); 

routes.MapRoute("News-ExplicitFormat", 
       "news.{format}" 
       new { controller = "News", action = "Browse" }); 

Il semble que ce serait utile d'avoir le soutien du système de routage quelque chose comme:

routes.MapRoute("News", 
       "news(.{format})?", 
       new { controller = "News", action = "Browse" }); 

Répondre

12

J'ai fait une méthode pour soutenir l'ajout de paires comme ceci comme suit:

public static void MapRouteWithOptionalFormat(this RouteCollection routes, 
               string name, 
               string url, 
               object defaults) 
{ 
    Route implicitRoute = routes.MapRoute(name + "-ImplicitFormat", 
              url, 
              defaults); 
    implicitRoute.Defaults.Add("format", string.Empty); 

    Route explicitRoute = routes.MapRoute(name + "-ExplicitFormat", 
              url + ".{format}", 
              defaults); 
} 
+1

Cela fonctionne bien, bien que j'ai changé l'ordre des routes implicites et explicites, en raison de l'explicite étant plus spécifiable. – ern

0

Vous pouvez utiliser l'utilisation de contraintes pour que cela fonctionne avec les routes normales.

MISE À JOUR: en fait, j'ai mal lu la question. L'autre réponse est la bonne chose à faire pour le moment. Ou créez un itinéraire personnalisé. Nous examinons l'idée de segments optionnels comme possibilité future.

+0

Phil, que chercherais-je à contraindre? .Contient (".")? Pourriez-vous décrire brièvement cette stratégie? Un travail impressionnant, au fait. Merci! –

+0

Phil Haack étant downvoted sur une question MVC, je parie que cela n'arrive pas trop souvent :) – fearofawhackplanet

+2

Je sais que c'est 2-3 ans, mais est-ce faisable maintenant? Je me demandais si je pouvais avoir '/ post/15' = html,'/post/15.json' = json api-data. – Alxandr