2012-03-27 18 views
7

Tengo una página web escrita en ASP.NET y necesito recuperar la hora local del usuario final en Page_Load. Pensé en usar Javascript para obtener la hora local (usando new Date()), pero el problema es que la secuencia de comandos se ejecuta después de los eventos del servidor.Cómo obtener la hora local del usuario en Page_Load

¿Alguna idea sobre cómo lograr esto?

EDITAR: Mi página es bastante compleja: muestra un gráfico con muchos campos calculados de una base de datos, listas de selección de objetos/campos, etc. El cliente ahora solicitó que considere la zona horaria del usuario y que la zona horaria sea determinada automáticamente por la página web. La fecha del usuario es importante para determinar el intervalo del gráfico (en qué día mostrar los datos). La carga de datos (ya que es muy complicado) se realiza tanto en Page_Load como en Page_PreRender. Renunciar a estos eventos requeriría una nueva página de reescritura.

SOLUCIÓN FINAL INSPIRADO POR RESPUESTA: Así es como resolví el problema finalmente. Estoy guardando la fecha local en una cookie. Este es el método que establece la cookie:

function SetLocalDateCookie() { 
    var cookieName = 'LOCALDATE'; 
    var localDate = new Date(); 
    var realMonth = localDate.getMonth() + 1; 
    var localDateString = localDate.getFullYear() + "/" + realMonth + "/" + localDate.getDate(); 
    setCookie(cookieName, localDateString, 2); 
    try { 
     var exdate = new Date(); 
     exdate.setDate(exdate.getDate() + 2); 
     document.cookie = cookieName + "=" + escape(localDateString) + ";expires=" + exdate.toGMTString(); 
    } 
    catch (e) 
    { } 
} 

En mi página maestra que llamo este método en $(document).ready. En la página donde utilizo esta cookie he añadido el código siguiente para Page_Init:

if (string.IsNullOrEmpty(CookieHandler.Instance.GetCookie(CookieKeys.LocalDate))) 
{ 
    Response.ClearContent(); 
    Response.Write(@"<form id='local' method='post' name='local'> 
         <script type='text/javascript'> 
          SetLocalDateCookie(); 
          document.getElementById('local').submit(); 
         </script> 
        </form>"); 
    Response.Flush(); 
    Response.End(); 
} 

Entonces puede simplemente utilizar el valor de la cookie en el código C#. ¡Gracias por sus respuestas/comentarios!

+4

¿Desea conocer la hora local del usuario antes de que se hayan ejecutado los eventos del servidor? – Curt

+0

Algo así ... sí: | –

+0

También pensé en usar una cookie ... pero su valor necesitaría ser constantemente actualizado (tiene que contener una fecha y hora); ¿Qué sucede la primera vez que se carga la página y la cookie no está configurada? –

Respuesta

4

voy a explicar un poco la siguiente código y qué izquierdas para que usted haga.

En la primera solicitud de esta página, el código comprueba si LocalTime ya no está almacenado en Session y si no, escribirá un elemento de formulario, una entrada oculta y un javascript que publicará ese formulario con la hora local. La respuesta finaliza, por lo que su informe no tendrá la oportunidad de generarse.

Este envío creará inmediatamente una solicitud POST con el conjunto localTime, luego ASP .Net almacena este valor POST en la sesión.

También agregué un redireccionamiento 302 (Response.Redirect) a la página original, debido a la facilidad de uso. El Usuario inicialmente realizó una solicitud GET, no una POST, por lo que si desea actualizar la página, el navegador reiterará la última acción, que fue esa form.submit() y no la solicitud GET.

Tiene la hora local. Pero no tiene que leerlo en cada solicitud, ya que se puede comparar con la hora UTC, y luego con la hora del servidor.

Editar: Necesita analizar la hora UTC en un DateTime, pero probablemente sea fácil encontrar el formato, aunque puede depender de la cultura del usuario (no estoy seguro acerca de esta afirmación).

public ReportPage() 
{ 
    this.Init += (o, e) => 
    { 
     // if the local time is not saved yet in Session and the request has not posted the localTime 
     if (Session["localTime"] == null && String.IsNullOrEmpty(Request.Params["localTime"])) 
     { 
      // then clear the content and write some html, a javascript code which submits the local time 
      Response.ClearContent(); 
      Response.Write(@"<form id='local' method='post' name='local'> 
           <input type='hidden' id='localTime' name='localTime' /> 
           <script type='text/javascript'> 
            document.getElementById('localTime').value = new Date(); 
            document.getElementById('local').submit(); 
           </script> 
          </form>"); 
      // 
      Response.Flush(); 

      // end the response so PageLoad, PagePreRender etc won't be executed 
      Response.End(); 
     } 
     else 
     { 
      // if the request contains the localtime, then save it in Session 
      if (Request.Params["localTime"] != null) 
      { 
       Session["localTime"] = Request.Params["localTime"]; 
       // and redirect back to the original url 
       Response.Redirect(Request.RawUrl); 
      } 
     } 
    }; 
} 
+0

Gracias por tu idea. Al final guardé la fecha local en una cookie (el formato no es importante porque guardo la cookie en mi propio formato 'personalizado'). Detallaré mi solución final en la descripción de la pregunta. –

+0

trabajado como encanto. Muchas gracias @Adrian Iftode – sharad

0

No creo que esto sea posible, no puede obtener el tiempo libre de la máquina local del cliente en el lado del servidor.

La única forma de lograr esto sería utilizando un javascript (ya que está basado en el cliente, por lo que usará la fecha/hora actual del cliente). Pero como ha indicado, esto será después de que se hayan ejecutado los eventos de su servidor, y su página web se haya procesado en HTML y se haya enviado al cliente.

Una alternativa sería capturar el tiempo de los clientes antes de la publicación posterior, pero no sería posible hacerlo con un Page_Load inicial.

+0

en el módulo http tiene muchos eventos ANTES DE PAGAR PÁGINA. –

+0

@Yo veo que quería el tiempo del cliente. Pensamiento del tiempo del servidor. :) eliminado. –

+0

@RoyiNamir ¡Ah, eso tiene sentido ahora! – Curt

0

¿Qué tal si coloca un cuadro de texto oculto en la página, adjuntarle un controlador de eventos OnChange en C# y utilizar una función OnLoad JavaScript para establecer el valor al valor que necesita del cliente?

+0

Déjame ver si entendí: las acciones que realizo en Page_Load se moverán en el controlador de eventos de OnChange. –

0

Por lo que yo sé, no hay ninguna manera de obtener la hora local del usuario en el evento Page_Load ya que se ejecuta en el lado del servidor y, por lo tanto, solo conoce la hora local del servidor .

Para obtener la hora local del usuario, necesitaría ejecutar una llamada asincrónica al servidor al cargar la página en JavaScript, o almacenar la hora local en un campo oculto y luego leerla en la devolución posterior.

0

o simplemente utilizar una página intersticial que contiene nada más que el js para obtener la hora local y la redirige a la página de corriente que pasa a través de la información de tiempo cadena de consulta o variable de sesión o publicar

Cuestiones relacionadas