Как узнать местное время пользователя на Page_Load - PullRequest
7 голосов
/ 27 марта 2012

У меня есть веб-страница, написанная на ASP.NET, и мне нужно получить локальное время конечного пользователя в Page_Load.Я думал об использовании Javascript для получения местного времени (используя new Date()), но проблема в том, что скрипт запускается после событий сервера.

Есть идеи, как этого добиться?

РЕДАКТИРОВАТЬ: Моя страница довольно сложная: она отображает диаграмму с большим количеством вычисляемых полей из базы данных, списков выбора объектов / полей и т. Д .;Теперь клиент запросил, чтобы он учитывал часовой пояс пользователя и чтобы этот часовой пояс автоматически определялся веб-страницей.Дата пользователя важна для определения интервала графика (какой день для отображения данных).Загрузка данных (поскольку это так сложно) выполняется как в Page_Load, так и в Page_PreRender.Отказ от этих событий потребовал бы полного переписывания страницы.

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ, ВДОХНОВЛЕННОЕ ОТВЕТОМ: Вот как я в конце концов решил проблему.Я держу местную дату в печенье.Вот метод, который устанавливает 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)
    { }
}

На моей главной странице я вызываю этот метод на $(document).ready.На странице, где я использую этот файл cookie, я добавил следующий код в 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();
}

Затем я могу просто использовать значение cookie в коде C #.Спасибо за ваши ответы / комментарии!

Ответы [ 5 ]

4 голосов
/ 27 марта 2012

Я немного объясню следующий код и то, что вам нужно сделать.

При первом запросе с этой страницы код проверяет, не сохранен ли LocalTime в сеансе, и если нетнапишет элемент формы, скрытый ввод и JavaScript, который опубликует эту форму с местным временем.Ответ заканчивается, поэтому ваш отчет не будет сгенерирован.

Эта отправка немедленно создаст запрос POST с установленным localTime, а затем ASP .Net сохранит это значение POST в сеансе.

Я также добавил перенаправление 302 (Response.Redirect) на исходную страницу из-за удобства использования.Пользователь первоначально сделал запрос GET, а не POST, поэтому, если он / она хочет обновить страницу, браузер будет повторять последнее действие, которое было этим form.submit (), а не запросом GET.

У вас сейчас местное время.Но вам не нужно читать его при каждом запросе, поскольку его можно сравнить с временем UTC, а затем со временем сервера.

edit: Вам необходимо проанализировать время UTC вa DateTime, но, вероятно, легко найти формат, хотя может зависеть от культуры пользователя (не уверен насчет этого утверждения).

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 голосов
/ 27 марта 2012

Или просто используйте промежуточную страницу, которая содержит только js, чтобы получить местное время и перенаправляет на вашу текущую страницу, передавая информацию о времени через строку запроса, переменную сеанса или сообщение

0 голосов
/ 27 марта 2012

Как насчет того, чтобы разместить скрытое текстовое поле на странице, присоединить к нему обработчик событий OnChange в C # и использовать функцию JavaScript OnLoad для установки значения, которое вам нужно от клиента?

0 голосов
/ 27 марта 2012

Насколько я знаю, нет никакого способа получить локальное время пользователя в событии Page_Load, поскольку оно выполняется на стороне сервера, и поэтому будет знать только локальную дату сервера время.

Чтобы узнать местное время пользователя, вам нужно будет выполнить асинхронный вызов сервера при загрузке страницы в JavaScript, или сохранить местное время в скрытом поле, а затем прочитать его после обратной передачи.

0 голосов
/ 27 марта 2012

Я не думаю, что это было бы возможно, вы не можете получить время от локального компьютера клиента на стороне сервера.

Единственный способ добиться этого - использовать некоторый JavaScript (так как этона основе клиента, поэтому он будет использовать текущую дату / время клиента).Но, как вы заявили, это произойдет после того, как события вашего сервера будут запущены, и ваша веб-страница будет преобразована в HTML и отправлена ​​клиенту.

Одной из альтернатив будет захват времени клиентов до того, какОтправить обратно, но это невозможно сделать с помощью начального Page_Load.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...