Чтобы прояснить, я пробовал решения с updatepanel
/ scriptmanager
, но я НЕ хочу их использовать.
Я хочу сделать эти сообщения jquery-ajax и ничего больше.
Допустим, такой сценарий.
У нас есть глобальное событие:
public static class CustomGlobalEvents
{
public delegate void SpecialEventRaisedEventHandler(object sender, string type, string msg);
public static event SpecialEventRaisedEventHandler SpecialEventRaised;
public static void SpecialEvent(object sender, string type, string msg)
{
if (SpecialEventRaised != null)
SpecialEventRaised(sender, type, msg);
}
}
У нас есть 2 веб-страницы: reciever.aspx и sender.aspx.
reciever.aspx имеет следующий код:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
CustomGlobalEvents.SpecialEventRaised += new CustomGlobalEvents.SpecialEventRaisedEventHandler(CustomGlobalEvents_SpecialEventRaised);
}
}
void CustomGlobalEvents_SpecialEventRaised(object sender, string type, string msg)
{
// do something
}
sender.aspx имеет следующий код:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
CustomGlobalEvents.SpecialEvent(this.Page, "type", "msg");
}
}
В обработчике событий reciever.aspx
для специального события CustomGlobalEvents_SpecialEventRaised
я хочу запустить javascript на странице reciever.aspx.
Например, сделать сообщение jquery ajax и обновить информацию на странице.
Я пытался внедрить JavaScript в менеджер сценариев, но так как менеджер сценариев не находится в асинхронном состоянии (даже если я принудительно обновляю updatePanel.Update();
), сценарий не попадает на страницу.
Другая идея состояла в том, чтобы попытаться инициировать generichandler напрямую, но это привело к sender.aspx
получению ответа вместо получателя со следующим кодом:
MyGenericHandler myGenericHandler = new MyGenericHandler();
myGenericHandler.ProcessRequest(HttpContext.Current);
, что может иметь смысл, поскольку именно sender.aspx фактически инициировал событие.
С этим ничего не происходит вообще:
MyGenericHandler myGenericHandler = new MyGenericHandler();
myGenericHandler.ProcessRequest(this.Context);
Лучшим способом было бы явно запустить generichandler
и каким-то образом заставить страницу reciever.aspx
получить ответ. Следующая лучшая вещь - это сказать reciever.aspx, что нужно запустить метод javascript.
Я пытался создать httpmodule
, чтобы попытаться что-то подключить, но не получилось.
Лучшее другое решение, которое я видел до сих пор, это на самом деле с помощью jquery отправлять ajax-пост каждые x секунд. Но это определенно НЕ то, что я хочу. Я хочу запустить его, когда он должен быть запущен (когда происходит событие на стороне сервера).
Решения, работающие с IIS6 или IIS7, подойдут любые, но это ASP.NET 3.5, а не MVC.
Есть идеи?
Редактировать: очевидно, не поддерживает открытые делегаты-тега stackoverflow ...:)