Проблемы с ASP.NET и пользовательскими событиями

У меня возникла проблема при обработке события ReceiveCompleted очереди сообщений в ASP.NET. Он успешно ловит его, но все изменения, примененные к элементам управления страницы, не действуют.

Вот что у меня есть:

.ASPX

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
   <ContentTemplate>
       <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
       <br />
       <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
   </ContentTemplate>
</asp:UpdatePanel>

<asp:Timer ID="Timer1" runat="server" Interval="3000" ontick="Timer1_Tick">
</asp:Timer>

.CS

private static System.Messaging.MessageQueue queue;
private static String messageContent;

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    queue = new MessageQueue(@".\Private$\MyQueue");
    queue.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
    queue.BeginReceive();
}


protected void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
{

    System.Messaging.Message message = queue.EndReceive(e.AsyncResult);
    message.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String,mscorlib" });

    Label1.Text = message.Body.ToString();      //Has no effect. The value updates without problem, but doesn't persist after finishing this method. And the Page doesn't refresh with this new value.
    Label2.Text = DateTime.Now.ToString();      //Has no effect too.
    Timer1.Interval = 99999;                    //And this one the same, no effect.
    messageContent = message.Body.ToString();   //.. But the value stored in this variable does persist

    queue.BeginReceive();
}

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

Заранее спасибо!

Пабло


person Pablo    schedule 29.01.2010    source источник
comment
У вас есть ScriptManager для updatePanel?   -  person curtisk    schedule 29.01.2010
comment
Да, у меня так: ‹asp:ScriptManager ID=ScriptManager1 runat=server›‹/asp:ScriptManager› ‹asp:UpdatePanel ID=UpdatePanel1 runat=server UpdateMode=Conditional ChildrenAsTriggers=False› ... ‹/asp:UpdatePanel ›   -  person Pablo    schedule 30.01.2010


Ответы (3)


Вы хотите, чтобы клиентская страница обновлялась по команде (вызванной mq_ReceiveCompleted) с сервера, верно? Это невозможно, если это так.

Мое предложение состоит в том, чтобы поместить клиентскую JS-функцию, которая будет вызываться по таймеру (каждую секунду или около того) и отправлять асинхронный запрос AJAX веб-службе для получения новых сообщений в MessageQueue. Если такое сообщение существует, JS предпримет любые необходимые действия (обновление страницы и т. д.)

person GregoryM    schedule 01.02.2010
comment
Да, это было моим намерением... Я думал, что можно обновить страницу с сервера, но я вижу, что ошибался. Спасибо за помощь! - person Pablo; 02.02.2010

Попробуйте установить UpdateMode="Always" в UpdatePanel или вызвать UpdatePanel1.Update(); в конце метода mq_ReceiveCompleted().

person GregoryM    schedule 29.01.2010

Убедитесь, что вы обновляете правильный экземпляр объекта страницы.

person Community    schedule 29.01.2010
comment
Как я могу это проверить? Я имею в виду, только вот так: Label1.Text = m.Body.ToString(); страница должна обновляться сама, не так ли? Во всяком случае, я попытался добавить UpdatePanel1.Update(), как предлагает GregoryM, и это не сработало. - person Pablo; 30.01.2010