Есть ли в ASP.Net MVC эквивалентный файл Ruby on Rails response_to format.xml и т. Д.? - PullRequest
11 голосов
/ 08 января 2010

В Ruby on Rails вы можете написать простое действие контроллера, например:

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

Для тех, кто не знаком с RoR, def index в этом случае будет эквивалентно public ActionResult Index() в контроллере ASP.Net MVC и разрешит следующие вызовы:

http://example.com/Movies/Index возвращается в виде HTML-страницы из представления index.html.erb (думаю, index.aspx)
http://example.com/Movies/Index.xml возвращает те же данные в формате xml (@movies - это объект, содержащий данные, используемые всеми представлениями)
http://example.com/Movies/Index.json возвращает строку JSON, полезную при выполнении вызовов javascript, требующих одинаковых данных / логики

Эквивалентный поток в ASP.Net MVC будет (если возможно) выглядеть примерно так (если он будет менее многословным, даже лучше):

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();
    }
}

Это действительно удобно, когда не нужно держать кучу разных действий в беспорядке на вашем контроллере, есть ли способ сделать что-то подобное в ASP.Net MVC?

Ответы [ 3 ]

8 голосов
/ 15 февраля 2010

В моем блоге я подробно описал метод обработки этого, который работает очень похоже на то, как он работает в Ruby on Rails. Вы можете найти ссылку внизу поста, но вот пример конечного результата:

public ActionResult Index()
{
    return RespondTo(format =>
    {
        format.Html = () => View();
        format.Json = () => Json(new { message = "hello world" });
    });
}

Вот ссылка на пост: http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

Может обрабатывать обнаружение правильного типа через заголовки HTTP, а также переменные в маршруте.

6 голосов
/ 14 января 2010

Итак, я играл с этим и добавил следующие маршруты в 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" }) %>

2 голосов
/ 10 января 2010

В ASP.NET MVC для этого нет встроенной поддержки. Тем не менее, есть образец инструментария REST, который вы можете скачать:

  • Скачать для ASP.NET MVC 1.0
  • Для ASP.NET MVC 2 исходный код инструментария REST интегрирован в загрузку MVC Futures как часть основной загрузки .

Узнайте больше о наборе инструментов REST в Блог Фила .

Инструментарий REST имеет "поставщиков форматов", которые определяют типы результатов для различных запросов. Руководящий документ доступен для загрузки в ASP.NET MVC 1.0. Вот выдержка из руководящего документа:

Этот контроллер теперь может возвращать XML или JSON в качестве ответа на запрос HTTP GET. Формат определяется на основе типа содержимого запроса или типов содержимого в заголовке Accepts запроса.

...