Problemas al usar Frames

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
    'str
ClientScript = "<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

Agregar a Technorati
Published Thu, May 31 2007 16:18 by cwalzer
Filed under:

Comments

# re: Problemas al usar Frames

Tuesday, September 04, 2007 9:38 AM by Renzo Frohlich

muy bueno el articulo me sirvio de mucho pero tengo una pregunta

como funcionaria esto para q haga submit la info de un web form a un frame

# re: Problemas al usar Frames

Thursday, September 06, 2007 9:08 PM by cwalzer

El atributo target del tag form te permite indicar el nombre del frame a donde va dirigido el post.

<form method="post" taget="frameName" action="pagina.aspx" />

# re: Problemas al usar Frames

Thursday, July 10, 2008 7:00 PM by luiscgg

Carlos, una pregunta: tengo un master page que tiene un menu de navegacion en el lado izquierdo (usando una tabla con 2 columnas, la del lado derecho, es la del contenido). Al mostrar un grid muy largo y desplazarme hacia abajo, pierdo de vista el menu de navegacion. Pense que la solucion a esto seria usar frames, tienes algun comentario como alternativa a este problema? Gracias de antemano y saludos

# re: Problemas al usar Frames

Friday, July 11, 2008 11:18 AM by cwalzer

En lugar de Frames usaría div como contendor y usaría css para hacer scroll solo sobre esa zona.

www.w3schools.com/.../pr_pos_overflow.asp

Leave a Comment

(required) 
(required) 
(optional)
(required) 
Powered by Community Server (Commercial Edition), by Telligent Systems