Возврат 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.