¿Cuál es la mejor manera de llamar a Response.Redirect
en el patrón Model-View-Presenter mientras se adhiere a la separación de niveles correcta?Forma más correcta de redirigir la página con Model-View-Presenter Patrón
Respuesta
Una forma en que manejé esto es que el presentador genere un evento (como Succeeded
o algo similar) al que la vista se suscribiría. Cuando el presentador finaliza su procesamiento, se levanta el evento, que será manejado por la Vista. En ese controlador, la vista se redirigiría a la página siguiente.
De esta forma, el presentador no necesita saber nada sobre páginas o URL ni nada. Simplemente sabe cuándo ha completado su tarea y le permite conocer la vista al plantear un evento. Puede plantear diferentes eventos si el presentador tuvo éxito o falló, en caso de que necesite redirigir a diferentes lugares.
La forma en que lo hacemos funciona bien una vez que se establece un poco de terreno. Sin embargo, estoy seguro de que hay varias maneras de despellejar a un gato. (Quien los gatos de todos modos. Los gatos son lindos y tierno!)
Primero, esto solo funcionará en los proyectos web compilados de ASP.Net, no en los sitios web.
Cada página debe heredar de una clase base abstracta costumbre que se ve algo como esto:
public abstract class PageBase : Page
{
private static string _baseUrl = "/";
public static string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected static string BuildUrl(string basePath)
{
if(!string.IsNullOrEmpty(basePath) && basePath.StartsWith("~/"))
{
basePath = basePath.replace("~/", BaseUrl);
}
return basePath;
}
protected static string LoadView(string path)
{
Response.Redirect(path);
}
}
Cada página también implementa una interfaz específica de la página. Cada interfaz específica de la página también se hereda de una interfaz base:
public interface IPageBase()
{
void LoadView(string path);
}
entonces es una cuestión de cada página que define su propia versión de BaseUrl. Es posible que desee contabilizar querystrings/encriptación de ruta/etc.
Finalmente, cualquiera de sus presentadores (que debería estar haciendo referencia a las interfaces específicas de la página) puede tomar BuildUrl estática() en una página deseada para ver y luego llamar a LoadView() con la ruta devuelta.
Depende de cuán genéricos sean sus presentadores. Si sus presentadores son totalmente independientes de la interfaz de usuario (se pueden reutilizar entre WinForms y WebForms), tendrá que abstraer la operación de redirección. En WebForms, la operación de redirección se implementaría en la vista mediante un Response.Redirect. En WinForms, (niego mucha experiencia con WinForms), creo que sería implementado por SomeForm.Show.
Una opción simple y fuera de lo común sería incluir en la interfaz de la vista un método ShowViewX(). Puede tener uno para cada formulario al que la vista podría redirigirse lógicamente. Alternativamente, la vista puede implementar un método de interfaz como Show (ConnectedViews) donde ConnectedViews es una enumeración que incluye un valor para cada una de las vistas a las que se puede "redireccionar" desde una vista particular. Esta enumeración viviría en el nivel del presentador.
Los enfoques anteriores son específicos para los pares de visualizador y presentador. En su lugar, podría implementarlo como una cuestión de todo el sistema. La lógica sería similar a la anterior, implementada en la vista base y el presentador. Habría un ShowView __() para cada formulario, o un método Show (Vistas) donde Views es una enumeración de todos los formularios.
Es un lanzamiento entre encapsulación y DRY-ness.
No sé si es la forma más correcta, conceptualmente. Pero lo que hice en mis últimas aplicaciones MVP, es crear un contenedor alrededor de HttpContext.Current
que llamé HttpRedirector. También creé un redirector ficticio para fines de prueba.Ambos hacen un seguimiento de la última URL redirigida, de modo que puedo verificar en mis pruebas de unidad que la redirección realmente sucedió cuando llamé a un método en mi controlador/presentador. Con un contenedor IOC, puedo cambiar la implementación de IRedirector
según el entorno (producción/prueba).
Resumiendo el 'HttpContext' También me gusta mucho –
- 1. ¿Cuál es la forma correcta de redirigir?
- 2. Forma correcta de redirigir después de enviar formulario
- 3. ¿La forma correcta de encontrar la excepción más interna?
- 4. Algunas aclaraciones sobre el patrón SyncRoot: ¿cuál es la forma correcta de usar este patrón?
- 5. ASP.NET MVC: ¿Cuál es la forma correcta de redirigir a páginas/acciones en MVC?
- 6. Página web redirigir a la página principal con CGI Python
- 7. cómo detener la página redirigir
- 8. ASP.net redirigir a la página de llamada
- 9. Forma correcta de incluir scripts en una página asp.net
- 10. ¿Redirigir a la página 404 incorporada de Apache con mod_rewrite?
- 11. redirigir una página automáticamente
- 12. ASP.NET MVC: la forma correcta de manejar un botón cancelar
- 13. cómo redirigir a la página de inicio
- 14. ¿Cuál es la forma correcta de escribir un patrón Singleton en Ruby?
- 15. Forma correcta de utilizar LINQ con CancellationToken
- 16. Forma correcta de obtener el doble más negativo
- 17. Python + Django página redirigir
- 18. Wordpress add_rewrite_rule para redirigir la página incorrectamente
- 19. redirigir a la página actual en ASP.Net
- 20. Language Switcher, redirigir a la página actual con symfony2.0
- 21. php redirigir a la página con el mensaje
- 22. Cómo romper el iframe y redirigir la página con Jquery
- 23. ¿La forma correcta de finalizar un BeginInvoke?
- 24. ¿Cuál es la forma correcta de insertar una tubería en una expresión de patrón Java?
- 25. ¿Cuál es la forma MVC de enviar un archivo simultáneamente y redirigir a una página nueva?
- 26. Android: forma correcta de saltar entre fragmentos
- 27. ¿Cuál es la forma correcta de usar maxAge con Express.js?
- 28. Redirigir más rápido, PHP o htaccess?
- 29. ¿La forma correcta de cerrar un OutputStream en Java?
- 30. ¿Es esta la forma correcta de implementar el patrón "Diseño por contrato" en PHP?
Esa es una idea interesante. –
He estado pensando en esto recientemente. ¿Existe realmente alguna ventaja específica de usar un evento en lugar de un método? –