sábado, 14 de noviembre de 2009

ASP.NET – Obtener resolucion de pantalla

irequiressesion Dejemos claro que si se quiere obtener la resolución de pantalla, hay que trabajar por el lado del cliente, una forma es usando javascript.

Hay diversidad de formas de obtener esta información, una de ellas es por ejemplo es hacer un redirect hacia otra página la cual a su vez debe hacer nuevamente redirect a la página original, pero adjuntando un par de parámetros GET, los cuales llevan la información del ancho y alto de pantalla recuperados via javascript… etc. Yo me resisto a usar esta técnica porque me parec inesperado que la página regrese con unos parámetros adicionales (ejemplo: pagina.aspx?width=1024&height=768)

Yo propongo otra forma, similar pero más sencilla. Empecemos.

Necesitamos un control de usuario (wucScreenResolution.ascx) y un controlador genérico (ScreenResolution.ashx).

1.- Vamos a crear el control de usuario llamado wucScreenResolution.ascx,

Este es todo el código que va en el .ascx lado:

<iframe id="iframeForScreenResolution" runat="server" width="0px" height="0px">
</
iframe>

Y este el código que va en el ascx.vb:

If IsNothing(Session("ScreenWidth")) Then
iframeForScreenResolution.Attributes.Add("onload", _
"location.href = 'ScreenResolution.ashx?w=' + " & _
"screen.width + '&h=' + screen.height + '&OriginalUrl=' + location.href")
End If

Ahora veamos el código completo que va en el archivo ScreenResolution.ashx:

Imports System.Web
Imports System.Web.Services

Public Class ScreenResolution
Implements IHttpHandler
Implements IRequiresSessionState

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

Dim w As String = HttpContext.Current.Request.QueryString("w")
Dim h As String = HttpContext.Current.Request.QueryString("h")
Dim OriginalUrl As String = HttpContext.Current.Request.QueryString("OriginalUrl")

HttpContext.Current.Session("ScreenWidth") = w
HttpContext.Current.Session("ScreenHeight") = h


context.Response.Redirect(OriginalUrl)

End Sub

ReadOnly Property
IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property

End Class

Dense cuenta que he añadido Implements IRequiresSessionState … lo cual me permite trabajar con sesiones desde el archivo ScreenResolution.ashx.

Finalmente, arrastra el control de usuario en la página en la cual te interese saber la resolución de pantalla. <body>


<
formid="form1"runat="server">


<
uc1:wucScreenResolutionID="wucScreenResolution1"runat="server" />

</
form>

</
body>

De preferencia arrastra el control en la página con la que arranca la aplicación (login.aspx, default.aspx, …etc). Además, si te das cuenta… si la variable de sesión que guarda los valores del ancho y alto de pantalla ya se cargaron… no será necesario que se ejecute el código nuevamente.

Aquí muestro cómo usar el código:

If Not IsNothing(Session("ScreenWidth")) Then
Dim
ScreenWidth As Integer = Session("ScreenWidth")
Select Case ScreenWidth
Case 1024
Panel1.Width = Unit.Pixel(100)
Case 1152
Panel1.Width = Unit.Pixel(200)
Case 1280
Panel1.Width = Unit.Pixel(300)
Case 1440
Panel1.Width = Unit.Pixel(400)
Case Else
'more code
End Select
End If

Hay que resaltar que si se está usando autenticación por formularios, hay que agregar la siguiente entrada en el web.config:

<location path="ScreenResolution.ashx">
<
system.web>
<
authorization>
<
allow users="*"/>
</
authorization>
</
system.web>
</
location>
Y eso sería todo ;) 

4 comentarios:

J4ime dijo...

La propiedad screen viene referenciada de Windows.Form, si el usuario viene de un sistema operativo distinto Linux,Mac... creo que no serviría o si?

Segundo Serrano dijo...

Hola J4ime,

la propiedad screen viene de javascript, por lo tanto es completamente compatible con todos los browsers respetables.

Saludos,

Jose dijo...

Buenas,
El codigo que va en el ascx.vb, ¿Se escribe en el load?
Lo he probado y no se rellena la variables session y ejecuta el control infinitas veces. ¿Que hago mal?

Jose dijo...

Funciona perfecto. Culpa mia, tenia un Session.Clear() en el load de la página que llamaba.