однако проблема в том, что Page_Load() SetResolution.aspx где можно сохранить переданные значения вызывается позже чем Page_Load() этой страницы, где они мне нужны. Как все-таки получить данные из клиентского скрипта в Page_Load()?
Re: Как передать данные в страницу ASP.NET из скрипта
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 из скрипта
Здравствуйте, 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 из скрипта
Здравствуйте, 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, Вы писали:
OE>хм, в обработчиках IHttpModule (BeginRequest/EndRequest) Session из HttpContext всегда == null
Потому что нужно реализовать IRequiresSessionState. Это весьма известная ловушка.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как передать данные в страницу ASP.NET из скрипта
Здравствуйте, Sinclair, Вы писали:
OE>>хм, в обработчиках IHttpModule (BeginRequest/EndRequest) Session из HttpContext всегда == null S>Потому что нужно реализовать IRequiresSessionState. Это весьма известная ловушка.
ага. Правда в BeginRequest/EndRequest Session все равно null, сессия есть только в AcquireRequestState.
А перенаправлять на другой адрес — через Server.Transfer(), или правильнее что-то в данных запроса переписать?
Re[5]: Как передать данные в страницу ASP.NET из скрипта
Здравствуйте, Odi$$ey, Вы писали: OE>А перенаправлять на другой адрес — через Server.Transfer(), или правильнее что-то в данных запроса переписать?
Я думаю, что лучше — Server.Transfer().
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как передать данные в страницу ASP.NET из скрипта
Здравствуйте, Sinclair, Вы писали:
S>3. Если нету, то будет отдавать вместо оригинального хэндлера страничку со скриптом, который будет S>3.1. Выставлять разрешение в сессии S>3.2. Повторять запрос (location.reload()), чтобы попасть в п.2.
а на что зацепить document.location.reload()? Потому как если это вставить в конец моей GetResolution(), то Page_Load() моей странички опять же исполняется раньше чем отрабатывается img src на подставной
Re[3]: Как передать данные в страницу ASP.NET из скрипта
Здравствуйте, 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 из скрипта
Здравствуйте, 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:
/// <system.web>
/// <httpModules>
/// <add name="ScreenResolutionSetterModule" type="Util.ScreenResolutionSetterModule, ModuleName" />
/// </httpModules>
/// <httpHandlers>
/// <add verb="*" path="ScreenResolutionSetter.axd" type="Util.ScreenResolutionSetterModule, ModuleName" validate="false"/>
/// </httpHandlers>
/// </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"].