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...
Пока на собственное сообщение не было ответов, его можно удалить.