Какой смысл возвращать ActionResult? - PullRequest
15 голосов
/ 14 ноября 2008

Какой смысл действия, возвращающего ActionResult?

Ответы [ 3 ]

20 голосов
/ 14 ноября 2008

Возврат ActionResult вместо того, чтобы «просто делать то, что делает ActionResult» (т. Е. Напрямую использовать Response.Redirect или пытаться отобразить View через Response OutputStream напрямую), дает вам одно действительно приятное преимущество: модульное тестирование действительно легко тем более, что обычно вам не требуется веб-сервер для модульного тестирования проектов MVC.

Приложение: В качестве примера для перенаправления:

Если вы делаете

return Redirect(newUrl);

в вашем контроллере, ваш юнит тест теперь может

  • Убедитесь, что возвращаемое значение имеет тип "RedirectResult"
  • Посмотрите на URL, на который перенаправляется, проверив result.Url после приведения его к RedirectResult
  • Все без необходимости раскручивать IIS или пытаться «ловко» перехватить ответный вызов. Прямой вызов
  • В конце дня RedirectResult вызывает Response.Redirect в своей функции ExecuteResult, но ваш тестовый модуль контроллера находится перед этим

Приложение 2: И пока я на нем, вот пример Custom ActionResult:

http://www.stum.de/2008/10/22/permanentredirectresult/

Это просто для того, чтобы показать, что они не "Черная магия". На самом деле они довольно просты: ваш контроллер возвращает результат действия, и среда выполнения MVC в конечном итоге вызовет для него функцию ExecuteResult, передавая ControllerContext, с которым ваш ActionResult может взаимодействовать. Суть снова в том, чтобы отделить части M-V-C, сделать Code многоразовым и упростить модульное тестирование, или вкратце: дать очень чистый Framework.

2 голосов
/ 14 ноября 2008

Поскольку это базовый класс, он позволяет вам возвращать любой из подклассов ActionResult, например ViewResult или JsonResult. Обычно я возвращаю ViewResult по умолчанию, но переопределяю это поведение, если имею дело с Ajax для возврата объекта JsonResult.

Это позволяет мне добавлять Ajax в качестве прогрессивного улучшения и поддерживать работу приложения без JavaScript и без необходимости отдельных действий контроллера.

1 голос
/ 14 ноября 2008

ActionResult является базовым классом для многих различных типов результатов контроллера. Возвращая базовый класс, действие контроллера может возвращать различные типы результатов в зависимости от результата метода - ViewResult, RedirectToActionResult и т. Д. ActionResult содержит все данные, необходимые представлению или новому действию, которое является результатом текущее действие контроллера.

...