Разница между ViewResult() и ActionResult()

В чем разница между ViewResult() и ActionResult() в ASP.NET MVC?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}

Ответ 1

ActionResult - абстрактный класс, который может иметь несколько подтипов.

Подтипы ActionResult

  • ViewResult - отображает определенное представление в потоке ответа

  • PartialViewResult - отображает частичное представление потока ответов

  • EmptyResult - возвращается пустой ответ

  • RedirectResult. Выполняет перенаправление HTTP на указанный URL.

  • RedirectToRouteResult. Выполняет перенаправление HTTP на URL-адрес, который определяется маршрутизация на основе данных маршрута

  • JsonResult. Сериализовать данный объект ViewData в формате JSON.

  • JavaScriptResult. Возвращает фрагмент кода JavaScript, который может быть выполнен на клиенте.

  • ContentResult. Записывает содержимое в поток ответов без необходимости просмотра.

  • FileContentResult. Возвращает файл клиенту.

  • FileStreamResult. Возвращает файл клиенту, который предоставляется Stream

  • FilePathResult. Возвращает файл клиенту.

Ресурсы

Ответ 2

ActionResult - абстрактный класс.

ViewResult происходит от ActionResult. Другие производные классы включают JsonResult и PartialViewResult.

Вы объявляете это так, чтобы вы могли использовать полиморфизм и возвращать разные типы тем же методом.

например:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

Ответ 3

По той же причине вы не пишете каждый метод каждого класса, чтобы вернуть "объект". Вы должны быть настолько конкретны, насколько сможете. Это особенно ценно, если вы планируете писать модульные тесты. Больше не нужно тестировать возвращаемые типы и/или выдавать результат.

Ответ 4

ViewResult является подклассом ActionResult. Метод View возвращает ViewResult. Так что действительно эти два фрагмента кода делают то же самое. Единственное отличие состоит в том, что с помощью ActionResult ваш контроллер не обещает вернуть представление - вы можете изменить тело метода, чтобы условно вернуть RedirectResult или что-то еще, не изменяя определение метода.

Ответ 5

В то время как другие ответы правильно распознают различия, обратите внимание, что если вы фактически возвращаете ViewResult, лучше вернуть более конкретный тип, а не базовый тип ActionResult. Очевидным исключением из этого принципа является то, что ваш метод возвращает несколько типов, происходящих из ActionResult.

Для полного обсуждения причин этого принципа см. приведенную здесь дискуссию: Должны ли методы ASP.NET MVC-контроллера возвращать ActionResult?

Ответ 6

В контроллере можно использовать синтаксис ниже

public ViewResult EditEmployee() {
    return View();
}

public ActionResult EditEmployee() {
    return View();
}

В приведенном выше примере изменяется только тип возвращаемого значения. один возвращает ViewResult, тогда как другой возвращает ActionResult.

ActionResult - это абстрактный класс. Он может принять:

ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult и т.д.

ViewResult является подклассом ActionResult.