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:
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?
Hola J4ime,
la propiedad screen viene de javascript, por lo tanto es completamente compatible con todos los browsers respetables.
Saludos,
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?
Funciona perfecto. Culpa mia, tenia un Session.Clear() en el load de la página que llamaba.
Publicar un comentario