ActionResult в ASP.NET MVC

среда, 27 апреля 2011, Александр Краковецкий

В ASP.NET MVC все запросы обрабатываются методами (actions) в контроллере (controller). Эти методы возвращают один из типов ActionResult. В самом простом случае это выглядит следующим образом:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Здесь у нас есть HomeController, у которого есть метод Index, который возвращает ActionResult (метод View() возвращает ViewResult).

Класс ActionResult является базовым, от него наследуются другие типы, как это показано на рисунке ниже:

alt text

Описание различных типов содержимого (*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:

alt text

Вот таблица соответствия 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"

На этом все.


Ищите нас в интернетах!

Комментарии

Свежие вакансии