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

249

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

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

public ActionResult Index()
{
    return View();
}
  • 11
    Отличный вопрос Я посмотрел видео и для создания модульных тестов инструктор сначала изменил тип возвращаемого действия, которое он собирался протестировать, с ActionResult на ViewResult. Без объяснения .... Я был как "Что мы можем просто случайно менять типы? Без объяснения"
  • 3
    Вероятно, эта документация полезна :) msdn.microsoft.com/en-us/library/…
Теги:
asp.net-mvc

6 ответов

322
Лучший ответ

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

Подтипы ActionResult

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

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

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

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

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

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

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

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

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

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

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

Ресурсы

  • 3
    В чем преимущество возврата ViewResult по сравнению с ActionResult - это просто немного более семантически и показывает ваши намерения - но на практике обычно нет никакой разницы?
113

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

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

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

например:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}
  • 1
    Означает ли это, что мы всегда должны возвращать ActionResult, чтобы получить его преимущество? Или есть какое-то ограничение или побочный эффект этого?
  • 4
    @Adarsh - то же самое с любым абстрактным классом в C #. Объявите это таким образом, если вы хотите инкапсулировать реализацию внутри метода или хотите в будущем проверить свой API для других производных типов. Если нет, используйте бетон. Я обычно использую бетон (например, ViewResult или JsonResult)
27

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

  • 0
    Более чистый код и модульное тестирование - это преимущество использования ViewResult, основанное на моем опыте.
18

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

10

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

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

3

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

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.

  • 4
    Я не уверен, что это то, что вы имели в виду, но на всякий случай я хочу уточнить, что вы не можете использовать эти два метода одновременно, так как их имя и (нет) параметры совпадают. Перегрузить метод невозможно, только изменив тип результата.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню