Какая точка возвращаемого типа ActionResult?

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

Ответы

Ответ 1

Возврат ActionResult вместо того, чтобы "делать все, что делает ActionResult" (т.е. напрямую использовать Response.Redirect или пытаться визуализировать представление через Response OutputStream) дает вам действительно хорошее преимущество: Unit Testing очень просто на что, тем более, что вам обычно не нужен веб-сервер для unit test проектов MVC.

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

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

return Redirect(newUrl);

в вашем контроллере, ваш unit test теперь может

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

Добавление 2: И пока я нахожусь на нем, вот пример пользовательского ActionResult:

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

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

Ответ 2

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

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

Ответ 3

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