Різниця між ViewResult () та ActionResult ()


295

Яка різниця між ViewResult()іActionResult() в ASP.NET MVC?

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

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

12
Чудове запитання. Я переглянув відеоролик і щоб створити одиничні тести, інструктор спочатку змінив тип повернення дії, який він збирався перевірити, з ActionResult на ViewResult. Ніяких пояснень .... Мені подобалося "Що ми можемо просто випадковим чином змінити типи? Без пояснень"
Дуг Чемберлен

3
Можливо, ця документація корисна :) msdn.microsoft.com/en-us/library/…
user3885927

Відповіді:


372

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

Підтипи ActionResult

  • ViewResult - надає заданий вид потоку відповідей

  • PartialViewResult - надає заданий частковий вигляд потоку відповідей

  • EmptyResult - повертається порожня відповідь

  • RedirectResult - виконує перенаправлення HTTP на вказану URL-адресу

  • RedirectToRouteResult - виконує перенаправлення HTTP до URL-адреси, яка визначається двигуном маршрутизації, на основі даних даних маршруту

  • JsonResult - серіалізує заданий об’єкт ViewData у формат JSON

  • JavaScriptResult - Повертає фрагмент коду JavaScript, який можна виконати на клієнті

  • ContentResult - записує вміст у потік відповідей, не вимагаючи перегляду

  • FileContentResult - Повертає файл клієнту

  • FileStreamResult - Повертає клієнту файл, який надається потоком

  • FilePathResult - Повертає файл клієнту

Ресурси


5
яка перевага повернення ViewResult над ActionResult - це лише трохи більш семантично і показує ваш намір, - але на практиці це не має значення?
niico

121

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

ViewResult походить від ActionResult . Інші похідні класи включають JsonResult та PartialViewResult .

Ви заявляєте це таким чином, щоб ви могли скористатися поліморфізмом і повернути різні типи одним і тим же методом.

наприклад:

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

2
Чи означає це, що ми завжди повинні повертати ActionResult, щоб ми отримали перевагу від цього. Або є обмеження чи побічна дія цього?
Адарш Кумар

5
@Adarsh ​​- це те ж саме з будь-яким абстрактним класом у C #. Оголосіть це таким чином, якщо ви хочете інкапсулювати реалізацію всередині методу або хочете надалі підтвердити свій API для інших похідних типізованих. Якщо ні, використовуйте бетон. Я зазвичай використовую бетон (наприклад, ViewResult або JsonResult)
RPM1984

31

Це з тієї ж причини, що ви не пишете кожен метод кожного класу для повернення "об'єкта". Ви повинні бути максимально конкретними. Це особливо цінно, якщо ви плануєте писати одиничні тести. Немає більше тестування типів повернення та / або виведення результату.


Тестування коду чистішого пристрою та тестування - це користь використання ViewResult на основі мого досвіду.
JoshYates1980

20

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


11

Хоча інші відповіді правильно відзначили відмінності, зауважте, що якщо ви насправді повертаєте лише ViewResult, то краще повернути більш конкретний тип, а не базовий тип ActionResult. Очевидним винятком із цього принципу є те, коли ваш метод повертає кілька типів, що походять від ActionResult.

Для повного обговорення причин цього принципу, будь ласка, дивіться відповідне обговорення тут: Потрібно ASP.NET Методи контролера MVC Повернути ActionResult?


4

У контролері можна використовувати синтаксис нижче

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
Я не впевнений, чи це саме ви мали на увазі, але на всякий випадок я хочу уточнити, що ви не можете мати ці два методи одночасно, оскільки їх ім'я та (ні) параметри однакові. Перевантажити метод неможливо, лише змінивши тип результату.
Андрій

0

У Controller я вказав наведений нижче код ActionResult, який є базовим класом, який може мати 11 підтипів у MVC, таких як: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileSontentResult, FileSontentResult, FileSontentResult, FileSontentResult, FileSontentResult, FileSontentResult

    public ActionResult Index()
                {
                    if (HttpContext.Session["LoggedInUser"] == null)
                    {
                        return RedirectToAction("Login", "Home");
                    }

                    else
                    {
                        return View(); // returns ViewResult
                    }

                }
//More Examples

    [HttpPost]
    public ActionResult Index(string Name)
    {
     ViewBag.Message = "Hello";
     return Redirect("Account/Login"); //returns RedirectResult
    }

    [HttpPost]
    public ActionResult Index(string Name)
    {
    return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
    }

Так само ми можемо повернути всі ці 11 підтипів, використовуючи ActionResult (), не чітко визначаючи кожен метод підтипу. ActionResult - найкраще, якщо ви повертаєте різні типи поглядів.


0

Щоб заощадити трохи часу, ось відповідь за посиланням у попередній відповіді на https://forums.asp.net/t/1448398.aspx

ActionResult - абстрактний клас, і це базовий клас для класу ViewResult.

У рамках MVC він використовує клас ActionResult для посилання на об'єкт, який повертає ваш метод дії. І викликає на ньому метод ExecuteResult.

І ViewResult є реалізацією для цього абстрактного класу. Він спробує знайти сторінку перегляду (зазвичай сторінку aspx) у деяких заздалегідь визначених контурах (/ views / ім'я контролера /, / views / shared / тощо) за вказаним іменем перегляду.

Зазвичай це хороша практика, щоб ваш метод повернув більш конкретний клас. Тож якщо ви впевнені, що ваш спосіб дії поверне певну сторінку перегляду, ви можете використовувати ViewResult. Але якщо ваш спосіб дії може мати різну поведінку, наприклад, або перегляньте або виконайте переадресацію. Ви можете використовувати більш загальний базовий клас ActionResult як тип повернення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.