В чем разница между 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
.
В Контроллере я указал приведенный ниже код с помощью ActionResult, который является базовым классом, который может иметь 11 подтипов в MVC, таких как: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePreamResult, FilePreamResult.
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 / controllername /, / views / shared / и т. Д.) По заданному имени представления.
Обычно рекомендуется, чтобы ваш метод возвращал более конкретный класс. Поэтому, если вы уверены, что ваш метод действия вернет какую-либо страницу просмотра, вы можете использовать ViewResult. Но если у вашего метода действия может быть другое поведение, например, вы можете визуализировать представление или выполнить перенаправление. Вы можете использовать более общий базовый класс ActionResult в качестве возвращаемого типа.