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
}