2008-11-14 23 views

Respuesta

1

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.

2

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.

20

Devolver un ActionResult en lugar de "simplemente hacer lo que hace ActionResult" (es decir, usar Response.Redirect directamente o intentar renderizar una vista directamente a través del Response OutputStream) le da una ventaja muy buena: Unit Testing es realmente fácil sobre eso, especialmente dado que normalmente no necesita un servidor web para probar los proyectos de MVC.

Adición: Como ejemplo para una redirección:

Si lo hace

return Redirect(newUrl); 

en su controlador, su prueba unitaria puede ahora

  • Compruebe que el valor de retorno es de Tipo "RedirectResult"
  • Mira la URL a la que se está redirigiendo marcando re sult.Url después de la fundición a RedirectResult
  • Todo ello sin tener que girar IIS o tratar de "Clevery" interceptar la llamada Response.Redirect
  • Al final del día, RedirectResult llama Response.Redirect en que es ExecuteResult función, pero su ensayo Unidad Controller se sienta delante de ese

Addendum 2: Y mientras estoy en él, aquí hay un ejemplo de un ActionResult personalizado:

http://www.stum.de/2008/10/22/permanentredirectresult/

Esto es solo para demostrar que no son "Black Magic". 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 asunto nuevamente es separar las partes de M-V-C, hacer Código Reutilizable, y hacer que las Pruebas de Unidad sean más fáciles, o en resumen: Dar un Marco muy limpio.

+0

ok así que en lugar de hacer Response.redirect, ¿cómo debería redirigir? ¿Usando redirectToAction? ¿y si la redirección es a una página que no tiene una acción? (diga una página .html) –

+0

¿Qué tal "Return Redirect (newUrl)"? Eso devuelve un RedirectResult y result.Url contiene la URL a la que se está redireccionando. Internamente, Redirect.Result llama al Response.Redirect estándar, pero para las pruebas unitarias, es mucho más fácil. –

+0

Agregó un ejemplo más elaborado a la respuesta. –

Cuestiones relacionadas