2008-11-01 15 views
11

Quiero hacer una ruta MVC para obtener una lista de noticias, que se pueden publicar en varios formatos.Rutas ASP.NET MVC con "Extensiones de archivos"

  • noticias -> (X) HTML
  • news.rss -> Fuente
  • news.atom -> ATOM

¿Es posible hacer esto (la "extensión opcional más general "La situación surge en varios lugares en mi diseño planificado) con una ruta? ¿O tengo que hacer dos rutas como esta:

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

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

Parece que sería útil contar con el apoyo del sistema de enrutamiento algo como:

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

Respuesta

12

Hice un método para admitir pares Sumar esto de la siguiente manera:

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

Esto funciona bien, aunque cambie el orden de las rutas implícitas y explícitas, debido a que el explícito es más específico. – ern

0

Puede considerar el uso de restricciones para que esto funcione con las rutas normales.

ACTUALIZACIÓN: en realidad, leí mal la pregunta. La otra respuesta es lo correcto por ahora. O crea una ruta personalizada. Estamos analizando la idea de segmentos opcionales como una posible característica futura.

+0

Phil, ¿qué estaría buscando restringir? .Contains (".")? ¿Podrías esbozar esta estrategia brevemente? Increíble trabajo, por cierto. ¡Gracias! –

+0

Phil Haack recibiendo una votación negativa en una pregunta de MVC, apuesto a que eso no sucede con demasiada frecuencia :) – fearofawhackplanet

+2

Sé que esto tiene 2-3 años, pero ¿es factible ahora? Me preguntaba si puedo tener '/ post/15' = html,'/post/15.json' = json api-data. – Alxandr

Cuestiones relacionadas