ASP.NET: как обновить интерфейс в подписанном обработчике - PullRequest
2 голосов
/ 06 декабря 2011

Ситуация

У меня есть веб-форма ASP.NET, которая содержит некоторую информацию о состоянии сеанса Microsoft Lync 2010 пользователя. В событии Page_Load я зарегистрировал обработчик событий, который прослушивает событие изменения состояния сеанса Lync.

Как только событие запускается, обработчик событий реагирует правильно и выполняет свою работу: он изменяет соответствующий текст конкретной метки. Проблема в том, что изменения не видны на веб-странице интерфейса пользователя.

Код

Это глобальный экземпляр клиента Lync, определенный на странице.

private LyncClient _lyncClient;

Здесь я регистрирую LyncClient в событии Page_Load.

protected void Page_Load(object sender, EventArgs e)
{
    RegisterLyncClient();
}

Я назначаю экземпляр LyncClient глобальному _lyncClient. После этого я регистрирую слушателя событий.

private void RegisterLyncClient()
{
    _lyncClient = LyncClient.GetClient();
    _lyncClient.StateChanged += HandleStateChanged;
}

Эта функция работает правильно, поскольку Lync Client меняет свое состояние. Его видно в режиме отладки.

private void HandleStateChanged(object sender, ClientStateChangedEventArgs e)
{
     SetLyncStatus(e.NewState);
}

Текст меток изменен правильно (в режиме отладки). Но изменения не видны во внешнем интерфейсе.

private void SetLyncStatus(ClientState lyncState)
{
    lblLyncStatus.Text = lyncState.ToString();
}

Успение

Если я использую кнопку для ручного изменения статуса или если я использую таймер для проверки и настройки состояния каждую секунду, изменения видны. Поэтому я предполагаю, что изменения, сделанные в обработчике события HandleStateChanged, не видны, поскольку после вызова функции SetLyncStatus обратной передачи не происходит.

Вопрос

Можно ли принудительно выполнить обратную передачу из обработчика событий, который не запускается действием пользователя (например, пользователь нажимает кнопку)? Было бы идеально, если бы можно было вызвать частичное обновление метки или определенного раздела.

Любые предложения очень ценятся. Спасибо!

1 Ответ

2 голосов
/ 06 декабря 2011

Прежде чем пытаться реализовать какое-либо решение, постарайтесь понять, что работает на клиенте, а на сервере.Возможно, у вас есть опыт разработки настольных систем, и, следовательно, вам также необходимо понимать природу веба без сохранения состояния.Любые изменения, происходящие на стороне сервера, не будут отражаться на стороне клиента и наоборот.После ответа сервера на запрос он не будет автоматически сообщать клиенту об обновлении статуса.Таким образом, даже управляемый подход не будет работать в вашем случае.Вам нужно выполнить пинг со стороны клиента, чтобы определить изменения статуса.Эту проверку можно выполнить с помощью AJAX с предварительно заданным периодическим интервалом.

...