asp.net mvc - una - ¿Cuál es el punto del tipo de devolución de ActionResult?
search asp net core (3)
¿Cuál es el sentido de una acción que devuelva ActionResult?
ActionResult es la clase base para muchos tipos diferentes de resultados de controlador. Al devolver la clase base, la acción del controlador puede devolver diferentes tipos de resultados según el resultado del método: un resultado de visualización, un resultado de redirección a acción, etc. ActionResult contiene todos los datos necesarios para la vista o acción nueva que es el resultado de la acción del controlador actual.
Dado que es la clase base, le permite devolver cualquiera de las subclases ActionResult, como ViewResult o JsonResult. Normalmente devuelvo ViewResult como predeterminado, pero anulo ese comportamiento si estoy tratando con Ajax para devolver un objeto JsonResult.
Esto me permite agregar Ajax como una mejora progresiva y mantener la aplicación funcionando sin JavaScript y sin la necesidad de acciones de controlador separadas.
Devolver un ActionResult en lugar de "simplemente hacer lo que está haciendo ActionResult" (es decir, usar Response.Redirect directamente o intentar renderizar una vista a través de Response OutputStream directamente) le da una ventaja muy buena: Unit Testing es realmente sencillo, especialmente ya que normalmente no necesita un servidor web para probar los proyectos de MVC.
Adición: como un ejemplo para una redirección:
Si lo haces
return Redirect(newUrl);
en su controlador, su Prueba de unidad ahora puede
- Verifique que el valor de retorno sea del tipo "RedirectResult"
- Mire la URL a la que se redirecciona revisando result.Url después de convertirla en RedirectResult
- Todo sin tener que girar IIS o intentar interceptar "inteligentemente" la llamada Response.Redirect
- Al final del día, RedirectResult llama a Response.Redirect en su función ExecuteResult, pero la prueba de unidad de controlador se encuentra delante de ese
Addendum 2: Y mientras estoy en ello, aquí hay un ejemplo de un Custom ActionResult:
http://www.stum.de/2008/10/22/permanentredirectresult/
Esto es solo para demostrar que no son "magia negra". En realidad, son bastante simples: el Controlador devuelve un Resultado de la Acción, y el MVC Runtime eventualmente llamará a la función ExecuteResult, pasando un ControllerContext con el que su ActionResult puede interactuar. Todo el punto nuevamente es separar las partes de MVC, hacer Código Reutilizable y hacer que las Pruebas de Unidad sean más fáciles, o en resumen: Dar un Marco muy limpio.