Is there an equivalent to Ruby on Rails' respond_to format.xml, etc in ASP.Net MVC?
asp.net, asp.net-mvc, asp.net-mvc-routing, routes
Solution
So I've been playing with this and added the following routes to RegisterRoutes():
routes.MapRoute("FormatAction", "{controller}/{action}.{format}",
new { controller = "Home", action = "Index" });
routes.MapRoute("FormatID", "{controller}/{action}/{id}.{format}",
new { controller = "Home", action = "Index", id = "" });
Now whenever I need a Controller Action to be "format aware" I simply add a `string format` argument to it (such as):
// Within Home Controller
public ActionResult MovieList(string format)
{
List<Movie> movies = CreateMovieList();
if ( format == "json" )
return Json(movies);
return View(movies);
}
Now when I call `/Home/MovieList` it returns the standard html view as always and if I make a call to `/Home/MovieList.json` it returns a JSON serialized string of the same data passed into the view. This will work for any view model you happen to be using, I'm using a very simple list just for the sake of tinkering.
To make things even better you can even do the following within the views:
Links to `/Home/MovieList` `<%= Html.ActionLink("Test", "MovieList") %>`
Links to `/Home/MovieList.json` `<%= Html.ActionLink("JSON", "MovieList", new { format = "json" }) %>`
Problem
In Ruby on Rails you can write a simple controller action such as: ``` def index @movies = Movies.find(:all) respond_to do |format| format.html #index.html.erb format.xml { render :xml => @movies } format.json { render :json => @movies } end end ``` For those unfamiliar with RoR, `def index` in this case would be the equivalent of `public ActionResult Index()` within an ASP.Net MVC Controller and would allow the following calls: `http://example.com/Movies/Index` returns as an html page from the view `index.html.erb` (think index.aspx) `http://example.com/Movies/Index.xml` returns the same data in xml format (`@movies` is the object containing the data all of the views use) `http://example.com/Movies/Index.json` returns a JSON string, useful when making javascript calls needing the same data/logic An equivalent flow in ASP.Net MVC would (if possible) likely look something like this (if it could be less verbose, even better): ``` public ActionResult Index() { Movies movies = dataContext.GetMovies(); // any other logic goes here switch (format) { case "xml": return View("XMLVIEW"); break; case "json": return View("JSONVIEW"); break; default: return View(); } } ``` This is really handy not having to keep a bunch of different actions cluttering up your controller, is there a way to do something similar in ASP.Net MVC?