Итак, я играл с этим и добавил следующие маршруты в 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 = "" });
Теперь, когда мне нужно, чтобы действие контроллера было «осведомлено о формате», я просто добавляю к нему string format
аргумент (такой как):
// Within Home Controller
public ActionResult MovieList(string format)
{
List<Movie> movies = CreateMovieList();
if ( format == "json" )
return Json(movies);
return View(movies);
}
Теперь, когда я вызываю /Home/MovieList
, он возвращает стандартное html-представление как всегда, а если я вызываю /Home/MovieList.json
, он возвращает сериализованную строку JSON тех же данных, переданных в представление. Это будет работать для любой модели представления, которую вы используете, я использую очень простой список только для того, чтобы переделать.
Чтобы сделать вещи еще лучше, вы даже можете сделать следующее в представлениях:
Ссылки на /Home/MovieList
<%= Html.ActionLink("Test", "MovieList") %>
Ссылки на /Home/MovieList.json
<%= Html.ActionLink("JSON", "MovieList", new { format = "json" }) %>