Różnica między viewresult () a ActionResult()

Jaka jest różnica między ViewResult() A ActionResult() w ASP.NET MVC?

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

public ActionResult Index()
{
    return View();
}
Author: GETah, 2011-01-20

7 answers

ActionResult jest klasą abstrakcyjną, która może mieć kilka podtypów.

Podtypy ActionResult

  • ViewResult - renderuje określony widok do strumienia odpowiedzi

  • PartialViewResult - renderuje określony częściowy widok do strumienia odpowiedzi

  • EmptyResult - zwracana jest pusta odpowiedź

  • RedirectResult - wykonuje przekierowanie HTTP do określonego URL

  • RedirectToRouteResult - wykonuje przekierowanie HTTP na adres URL określony przez silnik trasowania na podstawie danych o trasie

  • JsonResult - serializuje dany obiekt ViewData do formatu JSON

  • JavaScriptResult - zwraca fragment kodu JavaScript, który można wykonać na kliencie

  • ContentResult - zapisuje zawartość do strumienia odpowiedzi bez konieczności widok

  • FileContentResult - zwraca plik do Klienta

  • FileStreamResult - zwraca klientowi plik, który jest dostarczany przez strumień

  • FilePathResult - zwraca plik do Klienta

Zasoby

 353
Author: Divi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 14:48:18

ActionResult jest klasą abstrakcyjną.

Viewresult wywodzi się z ActionResult . Inne klasy pochodne to JsonResult i PartialViewResult .

Deklarujesz to w ten sposób, więc możesz skorzystać z polimorfizmu i zwrócić różne typy w tej samej metodzie.

Np:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}
 114
Author: RPM1984,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-20 05:30:58

Z tego samego powodu nie zapisujesz każdej metody każdej klasy, aby zwracała "obiekt". Powinieneś być tak dokładny, jak tylko możesz. Jest to szczególnie cenne, jeśli planujesz pisać testy jednostkowe. Koniec z testowaniem typów zwrotów i / lub odlewaniem wyniku.

 29
Author: RickAndMSFT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-06 18:59:18

ViewResult jest podklasą ActionResult. Metoda View zwraca ViewResult. Tak naprawdę te dwa fragmenty kodu robią dokładnie to samo. Jedyną różnicą jest to, że w przypadku ActionResult kontroler nie obiecuje zwracania widoku - można zmienić treść metody na warunkowo zwracającą RedirectResult lub coś innego bez zmiany definicji metody.

 19
Author: Robert Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-20 05:33:50

Podczas gdy inne odpowiedzi poprawnie zauważyły różnice, zauważ, że jeśli w rzeczywistości zwracasz tylko ViewResult, lepiej jest zwrócić bardziej konkretny typ, a nie podstawowy typ ActionResult. Oczywistym wyjątkiem od tej zasady jest sytuacja, gdy metoda zwraca wiele typów pochodzących z ActionResult.

Aby uzyskać pełne omówienie przyczyn tej zasady, zobacz pokrewną dyskusję tutaj: Must ASP.NET MVC Controller Methods Return ActionResult?

 10
Author: Zaid Masud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:10

W kontrolerze można użyć poniższej składni

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

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

W powyższym przykładzie zmienia się tylko Typ zwrotu . jeden zwraca ViewResult podczas gdy drugi zwraca ActionResult.

ActionResult jest klasą abstrakcyjną . Może przyjąć:

ViewResult, PartialViewResult, EmptyResult , RedirectResult , RedirectToRouteResult, JsonResult , JavaScriptResult, ContentResult , FileContentResult , FileStreamResult, FilePathResult itd.

ViewResult jest podklasą ActionResult.

 3
Author: ruchit07,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 11:21:53

W kontrolerze podałem poniższy kod z ActionResult, który jest klasą bazową, która może mieć 11 podtypów w MVC jak: 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
    }

Podobnie możemy zwrócić wszystkie te 11 podtypów używając metody ActionResult () bez jawnego określania każdego podtypu. ActionResult jest najlepszą rzeczą, jeśli jesteś zwracanie różnych typów widoków.

 0
Author: Abhishek D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 17:42:27