Leyendo algunos posts he encontrado una lista de sugerencias de parte de Microsoft a la hora de elegir que técnica usar para mostrar el contenido común a todas las páginas de un sitio:
Usar Master Pages cuando:
-
No es crítico un refresh completo de la página
-
El desarrollo requiere un standard de página modificable mediante herencia
-
Le permitimos al usuario agregar la página a su lista de favoritos del explorador
Usar Frames cuando:
-
Es costoso hacer un refresh completo de la página
-
Le permitimos al usuario refrescar sectores de la página en distintos momentos.
-
El armado del HTML contenido en el frame es muy complejo de generar
Realmente no he encontrado casos en los que no vale la pena reemplazar la estrucura de Frames existente por el uso de MasterPages. En algunas situaciones el anidamiento de sucesivos frames hace la navegación compleja y que el código javascript a tal efecto se torne muy complejo.
Quien haya intentado hacer un Response.Redirect hacia otro frame sabe que no funciona. La redirección de páginas se refieren al Document en la que están actuando. Por lo tanto hay que escribir código DHTML para poder navegar en la jerarquía de frames contenidos en los framesets:
window.parent.parent.parent.parent
Esto es inevitable al utilizar frames, y potencialmente peligroso cuando se mezcla con la funcionalidad de Post-Backs de ASP.NET.
Supongamos que tenemos una página aspx que tiene un botón aceptar, el cual, luego de procesar todo lo necesario necesita forzar la navegación a otra página. Pero la navegación implica cargar HTML en otro frame que solicita la nueva página. Para ello deberíamos registrar un script de DHTML:
Private Sub btn_aceptar_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btn_aceptar.Click
'Procesamiento del botón aceptar Dim
strClientScript As String
strClientScript = "<script language=JavaScript> "
strClientScript += "window.parent.location='" & "../navegacion.aspx?IdOpcion=3" & "'"
strClientScript += " </script>"
Me.RegisterStartupScript("navigate", strClientScript)
End Sub
Si bien esto logra el efecto, resulta costoso, ya que la respuesta del servidor luego de procesar la página es todo el HTML que la representa mas el script que acabamos de registrar. El cual se ejecuta no bien termina de parsearse la página en el Browser y hace la redirección. Conclusión, hemos transferido al explorador código HTML totalmente innecesario.
Para evitar todo ese código HTML, y enviar el browser solo el script necesario para la navegación, deberíamos hacer un Server.Transfer(). Esta instrucción corta la ejecución de la página corriente y comienza la ejecución de otra, anulando todo el buffer de salida de la primera y así evitando el HTML innecesario.
Private Sub btn_aceptar_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btn_aceptar.Click
'Procesamiento del botón aceptar
'Dim strClientScript As String
'strClientScript = "<script language=JavaScript> "
'strClientScript += "window.parent.location='" & "../navegacion.aspx?IdOpcion=3" & "'"
'strClientScript += " </script>"
'Me.RegisterStartupScript("navigate", strClientScript) HttpContext.Current.Items.Add("navigateTo", "../navegacion.aspx?IdOpcion=3")
Server.Transfer("redirect.aspx", True)
End Sub
Este es el código de la página redirect.aspx
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim strClientScript As String
strClientScript = "<script language=JavaScript> "
strClientScript += "window.parent.location='" & HttpContext.Current.Items.Item("navigateTo").ToString() & "'"
strClientScript += " </script>"
Me.RegisterStartupScript("navigate", strClientScript)
End Sub