¿Cuál es la diferencia entre ViewResult()
y ActionResult()
en ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
asp.net
asp.net-mvc
Domnic
fuente
fuente
Respuestas:
ActionResult es una clase abstracta que puede tener varios subtipos.
Subtipos de ActionResult
ViewResult - Representa una vista especificada en la secuencia de respuesta
PartialViewResult - Representa una vista parcial especificada en la secuencia de respuesta
EmptyResult : se devuelve una respuesta vacía
RedirectResult : realiza una redirección HTTP a una URL especificada
RedirectToRouteResult : realiza una redirección HTTP a una URL determinada por el motor de enrutamiento, en función de los datos de ruta dados
JsonResult : serializa un objeto ViewData dado en 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
fuente
ActionResult es una clase abstracta.
ViewResult deriva de ActionResult . Otras clases derivadas incluyen JsonResult y PartialViewResult .
Lo declaras de esta manera para que puedas aprovechar el polimorfismo y devolver diferentes tipos en el mismo método.
p.ej:
fuente
Es por la misma razón por la que no escribe 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 devolución y / o envío del resultado.
fuente
ViewResult es una subclase de ActionResult. El método View devuelve un ViewResult. Entonces, realmente estos dos fragmentos de código hacen exactamente lo mismo. La única diferencia es que con el 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.
fuente
Si bien otras respuestas han notado las diferencias correctamente, tenga en cuenta que si de hecho está devolviendo un ViewResult solo, es mejor devolver el tipo más específico en lugar del tipo base de ActionResult. 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 ASP.NET MVC devolver ActionResult?
fuente
En el controlador, se podría usar la siguiente sintaxis
En el ejemplo anterior, solo varía el tipo de retorno. uno regresa
ViewResult
mientras que el otro regresaActionResult
.ActionResult es una clase abstracta. Puede aceptar:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult, etc.
El
ViewResult
es una subclase deActionResult
.fuente
En Controller, especifiqué 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, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePtreamResult.
Del mismo modo, podemos devolver todos estos 11 subtipos usando ActionResult () sin especificar explícitamente cada método de subtipo. ActionResult es lo mejor si está devolviendo diferentes tipos de vistas.
fuente
Para ahorrarle tiempo, aquí está la respuesta de un enlace en una respuesta anterior en https://forums.asp.net/t/1448398.aspx
ActionResult es una clase abstracta, y es la clase base para la clase ViewResult.
En el marco MVC, utiliza la clase ActionResult para hacer referencia al objeto que devuelve su método de acción. E invoca el método ExecuteResult en él.
Y ViewResult es una implementación para esta clase abstracta. Intentará encontrar una página de vista (generalmente página aspx) en algunas rutas predefinidas (/ views / controllername /, / views / shared /, etc.) por el nombre de vista dado.
Por lo general, es una buena práctica hacer que su método devuelva una clase más específica. Entonces, si está seguro de que su método de acción devolverá alguna página de vista, puede usar ViewResult. Pero si su método de acción puede tener un comportamiento diferente, como representar una vista o realizar una redirección. Puede usar la clase base más general ActionResult como tipo de retorno.
fuente