tags:

views:

673

answers:

2

I want to make an MVC route for a list of news, which can be served in several formats.

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

Is it possible to do this (the more general "optional extension" situation crops up in several places in my planned design) with one route? Or do I need to make two routes like this:

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

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

It seems like it would be useful to have the routing system support something like:

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

I made a method to support adding pairs like this as follows:

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);
}
Doug McClean
This works well, though I switched the order of the implicit and explicit routes, due to the explicit being more specifiable.
ern
A: 

You can look into using constraints to make this work with normal routes.

UPDATE: actually, I misread the question. The other answer is the correct thing to do for now. Or create a custom route. We're looking at the idea of optional segments as a possible future feature.

Haacked
Phil, what would I be looking to constrain? .Contains(".")? Could you outline this strategy briefly?Awesome work, by the way. Thanks!
Doug McClean