Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 02.09.09 03:12
Оценка:
сделал по примеру из http://rsdn.ru/forum/dotnet.web/649946.1.aspx
Автор: mogadanez
Дата: 21.05.04
:

<script type="text/javascript">
    function GetResolution() 
    {
        var elem = document.getElementById("ScreenResolutionSetter");
        if (elem != null) 
            elem.src = 'SetResolution.aspx?ScreenResolutionW=' + window.screen.width + '&ScreenResolutionH=' + window.screen.height;
    }
</script>

<body onload="GetResolution()">
...

<img id="ScreenResolutionSetter" src="" alt="" width="1" height="1"/>

однако проблема в том, что Page_Load() SetResolution.aspx где можно сохранить переданные значения вызывается позже чем Page_Load() этой страницы, где они мне нужны. Как все-таки получить данные из клиентского скрипта в Page_Load()?
Re: Как передать данные в страницу ASP.NET из скрипта
От: SteckInc  
Дата: 02.09.09 05:54
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>сделал по примеру из http://rsdn.ru/forum/dotnet.web/649946.1.aspx
Автор: mogadanez
Дата: 21.05.04
:


OE>
OE><script type="text/javascript">
OE>    function GetResolution() 
OE>    {
OE>        var elem = document.getElementById("ScreenResolutionSetter");
OE>        if (elem != null) 
OE>            elem.src = 'SetResolution.aspx?ScreenResolutionW=' + window.screen.width + '&ScreenResolutionH=' + window.screen.height;
OE>    }
OE></script>

OE><body onload="GetResolution()">
OE>...

OE><img id="ScreenResolutionSetter" src="" alt="" width="1" height="1"/>
OE>

OE>однако проблема в том, что Page_Load() SetResolution.aspx где можно сохранить переданные значения вызывается позже чем Page_Load() этой страницы, где они мне нужны. Как все-таки получить данные из клиентского скрипта в Page_Load()?

Так, давайте определимся.
Page_Load это всё-таки серверное событие, которое никак не связано с отдачей страницы клиенту, точно так-же как не связаны Page_Load и body onload.
Где именно вам необходимо получить значения window.screen.width и window.screen.height?

Если Вам они нужны непосредственно на странице, которая проставляет этот скрипт, то может быть имеет смысл разнести всё хозяйство на две страницы? В том смысле что первым запросом отдаём почти пустую страницу с кодом получения разрешения, после чего уже при помощи Ajax добавляем вторую страницу, передавай ей разрешение в качестве параметра.
Либо один раз запоминать разрешение (скажем при логине, а потом по мере необходимости его менять, но тут получится небольшая задержка)
Re[2]: Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 02.09.09 07:23
Оценка:
Здравствуйте, SteckInc, Вы писали:

OE>>Как все-таки получить данные из клиентского скрипта в Page_Load()?

SI>Где именно вам необходимо получить значения window.screen.width и window.screen.height?

в Page_Load() определенной страницы

SI>Если Вам они нужны непосредственно на странице, которая проставляет этот скрипт,


да, желательно чтоб все было в одном месте — и скрипт, который получает window.screen.width и window.screen.height и код который их использует

SI>то может быть имеет смысл разнести всё хозяйство на две страницы? В том смысле что первым запросом отдаём почти пустую страницу с кодом получения разрешения, после чего уже при помощи Ajax добавляем вторую страницу, передавай ей разрешение в качестве параметра.


это не очень понял

SI>Либо один раз запоминать разрешение (скажем при логине, а потом по мере необходимости его менять, но тут получится небольшая задержка)


пока у меня так и сделано, но это некрасиво, во-первых надо постоянно помнить что данные для этой страницы готовятся где-то там, чтоб не отрефакторить чего лишнего, а во-вторых нельзя заходить на сайт прямо с этой страницы
Re: Как передать данные в страницу ASP.NET из скрипта
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.09 09:47
Оценка: 30 (1)
Здравствуйте, Odi$$ey, Вы писали:
OE>однако проблема в том, что Page_Load() SetResolution.aspx где можно сохранить переданные значения вызывается позже чем Page_Load() этой страницы, где они мне нужны. Как все-таки получить данные из клиентского скрипта в Page_Load()?
Это невозможно. К моменту, когда клиентский скрипт доехал до клиента, Page_Load() уже давно отработал. Только при следующем запросе можно сделать что-то полезное.
Поэтому можно сделать так:
1. Написать IHttpModule, который будет по-быстрому проверять, есть ли в сессии данные про разрешение.
2. Если есть, или если запрос — не GET, то ничего не делать
3. Если нету, то будет отдавать вместо оригинального хэндлера страничку со скриптом, который будет
3.1. Выставлять разрешение в сессии
3.2. Повторять запрос (location.reload()), чтобы попасть в п.2.
С точки зрения клиента, это будет выглядеть как мимолётное мерцание перед появлением нужной странички.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.09.09 06:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>1. Написать IHttpModule, который будет по-быстрому проверять, есть ли в сессии данные про разрешение.


хм, в обработчиках IHttpModule (BeginRequest/EndRequest) Session из HttpContext всегда == null
Re[3]: Как передать данные в страницу ASP.NET из скрипта
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.09 06:24
Оценка: 30 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>хм, в обработчиках IHttpModule (BeginRequest/EndRequest) Session из HttpContext всегда == null

Потому что нужно реализовать IRequiresSessionState. Это весьма известная ловушка.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.09.09 07:26
Оценка:
Здравствуйте, Sinclair, Вы писали:

OE>>хм, в обработчиках IHttpModule (BeginRequest/EndRequest) Session из HttpContext всегда == null

S>Потому что нужно реализовать IRequiresSessionState. Это весьма известная ловушка.

ага. Правда в BeginRequest/EndRequest Session все равно null, сессия есть только в AcquireRequestState.

А перенаправлять на другой адрес — через Server.Transfer(), или правильнее что-то в данных запроса переписать?
Re[5]: Как передать данные в страницу ASP.NET из скрипта
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.09 08:00
Оценка:
Здравствуйте, Odi$$ey, Вы писали:
OE>А перенаправлять на другой адрес — через Server.Transfer(), или правильнее что-то в данных запроса переписать?
Я думаю, что лучше — Server.Transfer().
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.09.09 10:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>3. Если нету, то будет отдавать вместо оригинального хэндлера страничку со скриптом, который будет

S>3.1. Выставлять разрешение в сессии
S>3.2. Повторять запрос (location.reload()), чтобы попасть в п.2.

а на что зацепить document.location.reload()? Потому как если это вставить в конец моей GetResolution(), то Page_Load() моей странички опять же исполняется раньше чем отрабатывается img src на подставной
Re[3]: Как передать данные в страницу ASP.NET из скрипта
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.09.09 01:37
Оценка:
Здравствуйте, Odi$$ey, Вы писали:
OE>а на что зацепить document.location.reload()? Потому как если это вставить в конец моей GetResolution(), то Page_Load() моей странички опять же исполняется раньше чем отрабатывается img src на подставной
Ага, значит, почти уже готово. Теперь надо избавиться от img src. Возьми XMLHttpRequest (в jQuery вроде был подходящий) и выполни его в конце GetResolution.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как передать данные в страницу ASP.NET из скрипта
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 04.09.09 06:02
Оценка: 62 (1)
#Имя: FAQ.asp.net.screen.resolution
Здравствуйте, Sinclair, Вы писали:

S>Ага, значит, почти уже готово. Теперь надо избавиться от img src. Возьми XMLHttpRequest (в jQuery вроде был подходящий) и выполни его в конце GetResolution.


ok, вот что получилось с передачей разрешения экрана клиента на сервер:

1. Класс, делающий основную работу:

using System;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Diagnostics;

namespace Util
{
    /// <summary>
    /// Перехватчик запросов для установки в сессии параметров разрешения экрана клиента
    /// до начала работы на сервере любых aspx страниц.
    /// </summary>
    /// <remarks>Для включения в работу надо добавить в web.config: 
    /// &lt;system.web>
    ///   &lt;httpModules>
    ///        &lt;add name="ScreenResolutionSetterModule" type="Util.ScreenResolutionSetterModule, ModuleName" />
    ///    &lt;/httpModules>
    ///   &lt;httpHandlers>
    ///        &lt;add verb="*" path="ScreenResolutionSetter.axd" type="Util.ScreenResolutionSetterModule, ModuleName" validate="false"/>
    ///   &lt;/httpHandlers>
    /// &lt;/system.web>
    /// </remarks>
    public class ScreenResolutionSetterModule : IHttpModule, IRequiresSessionState, IHttpHandler
    {
        #region IHttpModule Members

        /// <summary>
        /// Освобождение ресурсов
        /// </summary>
        public void Dispose()
        {
            //очистка не требуется
        }

        /// <summary>
        /// Инициализация
        /// </summary>
        /// <param name="context">Объект HttpApplication, предоставляющий доступ к методам, 
        /// свойствам и событиям, являющимся общими для всех объектов в приложении ASP.NET.</param>
        public void Init(HttpApplication context)
        {
            context.AcquireRequestState += OnAcquireRequestState;
        }

        /// <summary>
        /// Обработчик события достижения ASP.NET текущего состояния (например, состояния сеанса), связанного с текущим запросом.
        /// </summary>
        /// <param name="source">Источник</param>
        /// <param name="e">Данные</param>
        public void OnAcquireRequestState(Object source, EventArgs e)
        {
            HttpApplication app = (HttpApplication)source;
            HttpContext context = app.Context;

            if (context.Session != null && 
                    context.Session["ScreenResolutionW"] == null && 
                        context.Request.HttpMethod == "GET" &&
                            // чтоб не зациклиться
                            Path.GetFileName(context.Request.FilePath).ToLower() != "screenresolutionsetter.axd")
            {
                // выдаем getScreenResolution.htm из ресурсов
                context.Response.Write(Properties.Resources.getScreenResolution);
                context.Response.Flush();
                // и привет
                app.CompleteRequest();
                // в getScreenResolution.htm есть скрипт, где после получения разрешения экрана клиента 
                // вызывается XMLHttpRequest на ScreenResolutionSetter.axd, 
                // что приводит в ProcessRequest() этого класса и сохранению разрешения в данных сессии,
                // а потом document.location.reload() для загрузки первоначально запрашиваемого ресурса
            }
        }
        #endregion

        #region IHttpHandler Members

        /// <summary>
        /// Обработчик НТТР-запроса, собственно и осуществляющий запись разрешения экрана в данные сессии
        /// </summary>
        /// <param name="context">Объект HttpContext, предоставляющий ссылки на внутренние серверные объекты 
        /// (например, Request, Response, Session и Server), используемые для обслуживания HTTP-запросов. </param>
        /// <remarks>Сюда попадаем из XMLHttpRequest со странички getScreenResolution.htm</remarks>
        public void ProcessRequest(HttpContext context)
        {
            context.Session["ScreenResolutionW"] = context.Request.Params["ScreenResolutionW"];
            context.Session["ScreenResolutionH"] = context.Request.Params["ScreenResolutionH"];
        }

        /// <summary>
        /// Можно ли повторно использовать созданный экземпляр обработчика IHttpHandler
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }
        #endregion
    }
}


2. В ресурсы сборки заталкиваем файл getScreenResolution.htm:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    <title></title>
</head>
    <!-- Получение разрешения экрана клиента и передача его на сервер. -->
    <script language="javascript" type="text/javascript">
        function getResolution() 
        {
            var req;
            if (window.XMLHttpRequest)
                req = new XMLHttpRequest();
            else
            {
                if (window.ActiveXObject)
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                else
                {
                    alert('Неподдерживаемый браузер или его настройки!   ');
                    return;
                }
            }
            req.open("GET", "ScreenResolutionSetter.axd?ScreenResolutionW=" + window.screen.width + "&ScreenResolutionH=" + window.screen.height, false);
            req.send(null);

            // дело сделали, можно уходить на оригинальную страницу
            document.location.reload();
        }
    </script>

<body onload="getResolution()">
</body>
</html>


3. Регистрируем обработчики в web.config:

<system.web>
    <httpHandlers>
        <!-- Регистрация обработчика для записи в сессию разрешения экрана клиента -->
        <add verb="*" path="ScreenResolutionSetter.axd" type="Util.ScreenResolutionSetterModule, ModuleName" validate="false"/>
    </httpHandlers>
    <httpModules>
        <add name="ScreenResolutionSetterModule" type="Util.ScreenResolutionSetterModule, ModuleName" />
    </httpModules>
</system.web>


Итого — в любом месте aspx страниц можно использовать Session["ScreenResolutionW"] и Session["ScreenResolutionH"].
разрешение экрана клиента screen resolution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.