2008-11-01 18 views
11

Ich möchte eine MVC-Route für eine Liste von Nachrichten, die in verschiedenen Formaten serviert werden können.ASP.NET MVC Routen mit "Dateierweiterungen"

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

Ist es möglich, dies zu tun (die allgemeinere „optionale Erweiterung "Situation taucht an mehreren Stellen in meinem geplanten Entwurf auf) mit einer Route? Oder muss ich zwei Routen wie diese machen:

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

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

Es scheint, wie es sinnvoll wäre, das Routing-System-Unterstützung etwas wie zu haben:

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

Antwort

12

ich eine Methode gemacht Zugabe Paare zu unterstützen, wie dies ist wie folgt:

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

Das funktioniert gut, obwohl ich die Reihenfolge der impliziten und expliziten Routen geändert habe, weil die explizite Spezifikation besser ist. – ern

0

Sie können prüfen, mit Einschränkungen, die dies mit normalen Routen arbeiten.

UPDATE: eigentlich habe ich die Frage falsch gelesen. Die andere Antwort ist das Richtige für den Moment. Oder erstellen Sie eine benutzerdefinierte Route. Wir betrachten die Idee von optionalen Segmenten als ein mögliches zukünftiges Merkmal.

+0

Phil, was würde ich einschränken wollen? .Bindungen (".")? Können Sie diese Strategie kurz skizzieren? Super Arbeit, übrigens. Vielen Dank! –

+0

Phil Haack, der auf einer MVC Frage downvoted ist, wette ich, dass nicht allzu oft geschieht :) – fearofawhackplanet

+2

Ich weiß, dass das 2-3 Jahre alt ist, aber ist das jetzt machbar? Ich habe mich gefragt, ob ich '/ post/15' = html,'/post/15.json' = json api-data haben kann. – Alxandr

Verwandte Themen