Какова точка действия, возвращающего 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 содержит все данные, необходимые для представления или нового действия, которое является результатом текущее действие контроллера.