В 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.