Каков наилучший способ обработки возвращаемых нескольких форматов в ASP.NET MVC - PullRequest
0 голосов
/ 26 августа 2009

В Rails есть приятная идиома, которая позволяет вам с помощью одного метода действия возвращать правильно отформатированные данные (json, xml, только данные) на основе формата, указанного клиентом (или полученного из запроса. выглядит примерно так ...

respond_to do |format|
  format.html #edit.html.erb
  format.json {render :text=> <your json here>), :layout=> false}
  format.xml ...

end

Каков предпочтительный способ сделать это в ASP.NET MVC? В идеале мне бы хотелось, чтобы фреймворк работал так же, как и Rails (например, иметь возможность возвращать ViewData, правильно отформатированный для формата, указанного клиентом или иначе выведенного из самого запроса).

Rails также позволяет вам создавать представления, специфичные для каждого типа, давая вам возможность по существу возвращать одни и те же данные во все представления и позволяя им корректно обрабатывать форматирование данных (так что у вас есть представление, которое создает xml, другое, которое создает JSON и еще один, который строит HTML). Возможно ли это с ASP.NET MVC? Фактически, эта модель лучше всего подходит для разделения задач imho, поскольку она позволяет контроллерам возвращать независимые от представления данные, тогда как большинство подходов, которые я вижу сегодня (включая приведенную выше строку "format.json ....: layout => false ") выполните преобразование JSON внутри контроллера и верните эти данные непосредственно клиенту при запросе этого формата.

В любом случае ... предложения, мысли, рекомендации?

Спасибо

1 Ответ

2 голосов
/ 26 августа 2009

В ASP.NET MVC действия контроллера обычно возвращают объекты, производные от ActionResult, который затем вызывается средой выполнения при генерации потока ответов.

В вашем распоряжении несколько классов, производных от ActionResult - ContentResult для текстовых результатов, ViewResult для содержимого из представления, JsonResult для сериализации иерархии объектов в JSON, RedirectResult для перенаправления и т. д.

Обычно вы передаете модель в результат и позволяете ей решить, как генерировать результат, но это не обязательно должна быть та же самая модель - я могу при необходимости передать отдельный объект каждому результату.

Конкретный тип результата, возвращаемого действием, не «запекается» в сигнатуре действия - вы можете легко передать параметр формата в ваше действие, и он может сгенерировать и вернуть другой ActionResult соответственно:

public ActionResult ListProducts(string format)
{
    List<Product> products = ProductService.GetAllProducts();
    if (format == "JSON")
    {
        // eg., transform model for JSON consumption
        List<JsonProduct> jsonProducts = ProductService.ToJSON(products); 
        return Json(jsonProducts);
    }
    else if (format == "XML")
    {
        return new XmlResult(products);
    }</p>

<pre><code>   // default is to return HTML from view, which expects List<Product> for model
   return View(products);

}

Обратите внимание, что методы Json() и View() встроены в контроллер и являются удобными методами для возврата JsonResult и ViewResult соответственно. XmlResult является примером пользовательского ActionResult, который принимает объект, сериализует его в XML, а затем возвращает результат в виде потока XML.

Пример немного надуманный, но он показывает, что контроллер координирует всю работу по выбору результата и построению / преобразованию модели, которая передается этому результату. Действия контроллера по-прежнему должны быть легковесными, поэтому вы переносите тяжелые задачи на службы, такие как загрузка модели с бизнес-уровня или преобразование объектов в одной модели в объекты в другой модели, например, для потребления JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...