¿Cuál es el objetivo de una acción que devuelva ActionResult?¿Cuál es el punto del tipo de retorno ActionResult?
Respuesta
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 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.
- 1. ¿Cuál es el punto del tipo de división en Go?
- 2. ¿Cuál es el punto del bloque finally?
- 3. ¿Cuál es el punto de "typedef algo tipo"?
- 4. ¿Cuál es el punto de las anotaciones del paquete?
- 5. ¿Cuál es el punto de DOCTYPE?
- 6. JABÓN - ¿Cuál es el punto?
- 7. HashMap.containsValue - ¿Cuál es el punto?
- 8. ¿Cuál es el punto de XPS?
- 9. Efecto del tipo de retorno siendo estático
- 10. ¿Cuál es el punto de especificar hibernate.jdbc.batch_size?
- 11. ¿Cuál es el punto de Convert.ToDateTime (bool)?
- 12. ¿Cuál es el punto de la coherencia del caché?
- 13. ¿Cuál es el punto de make_heap?
- 14. Javascript: ¿cuál es el punto de RegExp.compile()?
- 15. ¿Cuál es el punto de setArguments?
- 16. ¿Cuál es el punto de MethodImplOptions.InternalCall?
- 17. ¿Cuál es el punto de declarar estilo?
- 18. Propiedades de escritura, ¿cuál es el punto?
- 19. ¿Cuál es el punto del Web.config's system.web/Pages/Namespaces Tag?
- 20. ¿Cuál es el punto del operador unario plus en Ruby?
- 21. ¿Cuál es el punto del plugin viEmu para Visual Studio?
- 22. Copie dlls locales y del sistema ': ¿cuál es el punto?
- 23. ¿Cuál es el punto del operador nulo en JavaScript?
- 24. ¿Cuál es el punto de g ++ -Wreorder?
- 25. ¿Cuál es el punto de System.IO.dll?
- 26. ¿Cuál es el punto de aclocal?
- 27. ¿Cuál es el punto de los frijoles?
- 28. ¿Cuál es el punto de FILL_AND_STROKE?
- 29. ¿Cuál es el punto de document.defaultView?
- 30. ¿Cuál es el punto de STL?
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) –
¿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. –
Agregó un ejemplo más elaborado a la respuesta. –