Яка різниця між ViewResult()
іActionResult()
в ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Яка різниця між ViewResult()
іActionResult()
в ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Відповіді:
ActionResult - абстрактний клас, який може мати кілька підтипів.
ViewResult - надає заданий вид потоку відповідей
PartialViewResult - надає заданий частковий вигляд потоку відповідей
EmptyResult - повертається порожня відповідь
RedirectResult - виконує перенаправлення HTTP на вказану URL-адресу
RedirectToRouteResult - виконує перенаправлення HTTP до URL-адреси, яка визначається двигуном маршрутизації, на основі даних даних маршруту
JsonResult - серіалізує заданий об’єкт ViewData у формат JSON
JavaScriptResult - Повертає фрагмент коду JavaScript, який можна виконати на клієнті
ContentResult - записує вміст у потік відповідей, не вимагаючи перегляду
FileContentResult - Повертає файл клієнту
FileStreamResult - Повертає клієнту файл, який надається потоком
FilePathResult - Повертає файл клієнту
ActionResult - абстрактний клас.
ViewResult походить від ActionResult . Інші похідні класи включають JsonResult та PartialViewResult .
Ви заявляєте це таким чином, щоб ви могли скористатися поліморфізмом і повернути різні типи одним і тим же методом.
наприклад:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Це з тієї ж причини, що ви не пишете кожен метод кожного класу для повернення "об'єкта". Ви повинні бути максимально конкретними. Це особливо цінно, якщо ви плануєте писати одиничні тести. Немає більше тестування типів повернення та / або виведення результату.
ViewResult є підкласом ActionResult. Метод View повертає ViewResult. Тож справді ці два фрагменти коду роблять те саме. Єдина відмінність полягає в тому, що за допомогою ActionResult один ваш контролер не обіцяє повернути вигляд - ви можете змінити тіло методу, щоб умовно повернути RedirectResult або щось інше, не змінюючи визначення методу.
Хоча інші відповіді правильно відзначили відмінності, зауважте, що якщо ви насправді повертаєте лише ViewResult, то краще повернути більш конкретний тип, а не базовий тип ActionResult. Очевидним винятком із цього принципу є те, коли ваш метод повертає кілька типів, що походять від ActionResult.
Для повного обговорення причин цього принципу, будь ласка, дивіться відповідне обговорення тут: Потрібно ASP.NET Методи контролера MVC Повернути ActionResult?
У контролері можна використовувати синтаксис нижче
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
.
У 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 - найкраще, якщо ви повертаєте різні типи поглядів.
Щоб заощадити трохи часу, ось відповідь за посиланням у попередній відповіді на https://forums.asp.net/t/1448398.aspx
ActionResult - абстрактний клас, і це базовий клас для класу ViewResult.
У рамках MVC він використовує клас ActionResult для посилання на об'єкт, який повертає ваш метод дії. І викликає на ньому метод ExecuteResult.
І ViewResult є реалізацією для цього абстрактного класу. Він спробує знайти сторінку перегляду (зазвичай сторінку aspx) у деяких заздалегідь визначених контурах (/ views / ім'я контролера /, / views / shared / тощо) за вказаним іменем перегляду.
Зазвичай це хороша практика, щоб ваш метод повернув більш конкретний клас. Тож якщо ви впевнені, що ваш спосіб дії поверне певну сторінку перегляду, ви можете використовувати ViewResult. Але якщо ваш спосіб дії може мати різну поведінку, наприклад, або перегляньте або виконайте переадресацію. Ви можете використовувати більш загальний базовий клас ActionResult як тип повернення.