Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Суть такова. Я решил написать никому не нужный корпоративный чат, на примере которого хотел использовать наиболее оптимальные методы для передачи сообщений и их отображения, чтобы просто размяться. Я мыслил примерно так: Отправка. Тут всё ок. Создаём веб-сервис, который добавляет сообщение в БД, вызываем его по клику через JS XMLHttpRequest. Помещаем UpdatePanel, в которой будут находиться отображаемые сообщения. Помещаем туда PlaceHolder для сообщений и Timer, запускающийся, например, раз в 5 секунд. В начале, если не постбек, заполняем PlaceHolder последними 50 сообщениями (из базы) на Page_Load. Запоминаем последний ID сообщения (чтобы при следующем обращении не брать лишнего). Потом по тику таймера запрашиваем, есть ли в базе свежачок. Если есть - дописываем новые сообщения в PlaceHolder методом PlaceHolder.Controls.Add и перезаписываем последней ID (например, в сессию). Код получился примерно вот такой: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Естественно, что сообщения не добавляются (append), а перезаписываются (если имеются), а если новых нет, то вообще сбрасываются, потому что PlaceHolder не сохраняет своего состояния. Но дальше я подумал, что даже сохранение состояния (ViewState или ControlState) - это совершенно не то, что нужно. Т.к. довольно глупо передавать на сервер ViewState с сообщениями из чата, чтобы обратно их же загрузить клиенту, добавив пару новых. Примерно по той же причине нет смысла хранить их и на сервере. А вопрос такой: Как подсасывать сообщения с помощью Timer`a и UpdatePanel`и, сохраняя при этом уже полученные на клиенте без некрасивых лишних движений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:03 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Loknar, ну а что тут, создаете таймер Код: javascript 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:30 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
емое автор protected void timer1_Tick(object sender, EventArgs e) таймер то вам зачем? все делает запрос с клиента, он и сежачек вытаскивает. одна функция на сервере и больше ничего... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:33 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Где-то в степиемое автор protected void timer1_Tick(object sender, EventArgs e) таймер то вам зачем? все делает запрос с клиента, он и сежачек вытаскивает. одна функция на сервере и больше ничего... Эммм... А как делать запрос на проверку "Есть ли новые сообщения", если не по таймеру??? Насколько я понимаю, клиент может получить что-либо только если отправляет запрос. А сделать он это может либо что-то нажав, либо же по таймеру. Может быть, конечно, я чего-то не понимаю, но это же чат. Пользователь не будет спамить кнопку "обновить", чтобы посмотреть, что там на странице изменилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:44 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Loknar, Вы не доезжаете, на странице div, таймер, скрытое поле для метки последнего сообщения ( на любителя) и больше ничего ( давай уберем панель ввода сообщений) клиент открыл страницу, с сервера пришел див заполненный сообщениями для него на данный момент, и метка последнего сообщения, через каждые 10 сек, страница посылает запрос с меткой на сервер, если появились сообщения она добавляет их в див и меняет метку, если нет - ничего не предпринимает, можно без метки, тогда будет излишний контент для передачи. и дерганье дива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 17:52 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Где-то в степиLoknar, Вы не доезжаете, на странице div, таймер, скрытое поле для метки последнего сообщения ( на любителя) и больше ничего ( давай уберем панель ввода сообщений) клиент открыл страницу, с сервера пришел див заполненный сообщениями для него на данный момент, и метка последнего сообщения, через каждые 10 сек, страница посылает запрос с меткой на сервер, если появились сообщения она добавляет их в див и меняет метку, если нет - ничего не предпринимает, можно без метки, тогда будет излишний контент для передачи. и дерганье дива. Конечно, это будет работать. Но здесь вообще получается, что мы отправляем и получаем страницу целиком, а я как раз хочу сэкономить, для этого я и использую UpdatePanel. При этом, заполняя предложенный div мы непременно столкнёмся с тем, что будем отправлять и принимать весь его ViewState, а я хочу сэкономить даже на этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:07 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Loknar, откуда ты взял что он будет отправлять страницу целиком? аджаксом нативным ты будешь только отправлять метку, и больше ничего. а принимать только свежие записи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:15 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Loknar, Засунь свою панель обновления куда подальше, и забудь ее как страшный сон, это атавизм.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2014, 18:16 |
|
||
|
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
|
|||
|---|---|---|---|
|
#18+
Где-то в степиLoknar, откуда ты взял что он будет отправлять страницу целиком? аджаксом нативным ты будешь только отправлять метку, и больше ничего. а принимать только свежие записи... Да, кажется, теперь я понял, что имелось в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2014, 09:47 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=18&tid=1357227]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 364ms |

| 0 / 0 |
