entre diferencia asp.net asp.net-mvc

asp.net - Diferencia entre ViewResult() y ActionResult()



actionresult vs jsonresult (7)

¿Cuál es la diferencia entre ViewResult() y ActionResult() en ASP.NET MVC?

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


ActionResult es una clase abstracta que puede tener varios subtipos.

Subtipos de ActionResult

  • ViewResult : convierte una vista específica al flujo de respuesta

  • PartialViewResult : representa una vista parcial específica del flujo de respuesta

  • EmptyResult - Se devuelve una respuesta vacía

  • RedirectResult : realiza una redirección HTTP a una URL específica

  • RedirectToRouteResult : realiza una redirección HTTP a una URL determinada por el motor de enrutamiento, según los datos de ruta dados

  • JsonResult : serializa un objeto ViewData dado al formato JSON

  • JavaScriptResult : devuelve un fragmento de código JavaScript que se puede ejecutar en el cliente

  • ContentResult : escribe contenido en la secuencia de respuesta sin requerir una vista

  • FileContentResult : devuelve un archivo al cliente

  • FileStreamResult : devuelve un archivo al cliente, que es proporcionado por un Stream

  • FilePathResult - Devuelve un archivo al cliente

Recursos


En Controller he especificado el código siguiente con ActionResult, que es una clase base que puede tener 11 subtipos en MVC como: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, FileStreamResult

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 }

Del mismo modo, podemos devolver todos estos 11 subtipos utilizando ActionResult () sin especificar explícitamente cada método de subtipo. ActionResult es lo mejor si está devolviendo diferentes tipos de vistas.


En el controlador, uno podría usar la siguiente sintaxis

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

En el ejemplo anterior, solo el tipo de retorno varía. uno devuelve ViewResult mientras que el otro devuelve ActionResult .

ActionResult es una clase abstracta. Puede aceptar:

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

El ViewResult es una subclase de ActionResult .


Es por la misma razón que no escribes todos los métodos de cada clase para devolver "objeto". Debes ser lo más específico posible. Esto es especialmente valioso si planea escribir pruebas unitarias. No más pruebas de tipos de retorno y / o el resultado.


Mientras que otras respuestas han notado las diferencias correctamente, tenga en cuenta que si de hecho está devolviendo un ViewResult, es mejor devolver el tipo más específico en lugar del tipo ActionResult base. Una excepción obvia a este principio es cuando su método devuelve múltiples tipos derivados de ActionResult.

Para una discusión completa de las razones detrás de este principio, consulte la discusión relacionada aquí: ¿Deben los métodos del controlador MVC de ASP.NET devolver ActionResult?


ViewResult es una subclase de ActionResult. El método View devuelve un ViewResult. Así que realmente estos dos fragmentos de código hacen exactamente lo mismo. La única diferencia es que con ActionResult uno, su controlador no promete devolver una vista; puede cambiar el cuerpo del método para devolver condicionalmente un RedirectResult u otra cosa sin cambiar la definición del método.


ActionResult es una clase abstracta.

ViewResult deriva de ActionResult . Otras clases derivadas incluyen JsonResult y PartialViewResult .

Lo declara de esta manera para que pueda aprovechar el polimorfismo y devolver diferentes tipos en el mismo método.

p.ej:

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