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

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

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

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

7 ответов


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

Подтипов 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, FilePathResult.

    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-лучшая вещь если вы возвращаете разные типы представлений.