ActionResult в ASP.NET MVC
В ASP.NET MVC все запросы обрабатываются методами (actions) в контроллере (controller). Эти методы возвращают один из типов ActionResult. В самом простом случае это выглядит следующим образом:
public class HomeController : Controller { public ActionResult Index() { return View(); } }
Здесь у нас есть HomeController, у которого есть метод Index, который возвращает ActionResult (метод View() возвращает ViewResult).
Класс ActionResult является базовым, от него наследуются другие типы, как это показано на рисунке ниже:
Описание различных типов содержимого (*Results):
- ContentResult – текстовый тип содержимого;
- EmptyResult – пустой тип содержимого;
- FileContentResult – файл для загрузки (бинарник).
- FilePathResult – файл для загрузки (путь).
- FileStreamResult – файл для загрузки (файловый поток).
- JavaScriptResult – JavaScript код;
- JsonResult – Json - представление;
- PartialViewResult – HTML-код, который сформировался на базе partial view;
- RedirectResult – перенаправление на новый URL (302 или 301 в зависимости от передаваемого параметра);
- RedirectToRouteResult – перенаправление на специфический роут;
- ViewResult – HTML-код, полученный на базе представления (view);
- HttpNotFound - возвращает ошибку 404 (не найдено);
- HttpStatusCodeResult - возвращает специфическую ошибку.
Чтобы вернуть необходимый тип содержимого, нужно использовать методы, которые доступны в базовом классе Controller:
Вот таблица соответствия ActionResults и вспомогательных методов:
- ViewResult: View
- PartialViewResult: PartialView
- RedirectResult: Redirect
- RedirectToRouteResult: RedirectToAction, RedirectToRoute
- ContentResult: Content
- JsonResult: Json
- JavaScriptResult: JavaScript
- FileResult: File
- EmptyResult: (None)
Пример работы HttpNotFound и HttpStatusCodeResult:
public ActionResult SpecificResult() { return new HttpStatusCodeResult(404); } public ActionResult NotFound() { return HttpNotFound(); }
Если вы не используете ActionResult, как в этом примере:
public class HomeController : Controller { public int Add(int x, int y) { return x + y; } public Employee GetEmployee() { return new Employee(); } public void DoNothing() { } }
то с помощью класса ControllerActionInvoker определяется правильный ActionResult:
protected virtual ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue) { if (actionReturnValue == null) { return new EmptyResult(); } ActionResult actionResult = (actionReturnValue as ActionResult) ?? new ContentResult { Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture) }; return actionResult; }
В этом примере:
- метод DoNothing() вернет EmptyResult()
- метод GetEmployee() вернет ContentResult со строкой, которая соответствует текущий объект (а именно строку "MyNameSpace.Controllers.Employee")
- метод Add() для запроса /home/add?x=3&y=5 вернет ContentResult с текстом "8"
На этом все.
http://weblogs.asp.net/rajbk/archive/2010/05/03/actionresult-types-in-mvc2.aspx