Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся / 9 сообщений из 9, страница 1 из 1
18.06.2014, 17:03
    #38673312
Loknar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Суть такова.

Я решил написать никому не нужный корпоративный чат, на примере которого хотел использовать наиболее оптимальные методы для передачи сообщений и их отображения, чтобы просто размяться.

Я мыслил примерно так:
Отправка. Тут всё ок. Создаём веб-сервис, который добавляет сообщение в БД, вызываем его по клику через 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.
public int LastMessageIndex 
    {
        get
        {
            try
            {
                return Convert.ToInt32(Session[Curuser+"_MSG"]);                     
            }
            catch
            {
                return 0;
            }
        }
        set
        {
            Session[Curuser+"_MSG"] = value;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LastMessageIndex = 0;
            FillUPanel();
        }
    }
    protected void timer1_Tick(object sender, EventArgs e)
    {
        FillUPanel();
    }

    public void FillUPanel()
    {
        string textForLiteral = "";
        DataTable dt = new DBManager.DBManager().SqlText("exec database1.dbo.[AnyMessagesForMe] '" + Curuser + "', " + LastMessageIndex.ToString()).ExecuteDataTable();
        if (dt.Rows.Count > 0)
        {
            foreach (DataRow dr in dt.Rows)
            {
                textForLiteral += "<div>";
                textForLiteral += Convert.ToDateTime(dr["CreateDate"].ToString()).ToString("HH:mm:ss") + ":  ";
                textForLiteral += dr["FromUser"].ToString() + ":  ";
                textForLiteral += dr["Body"].ToString();
                textForLiteral += "</div>";
            }
            PHMessages.Controls.Add(new LiteralControl(textForLiteral));            
            LastMessageIndex = Convert.ToInt32(dt.Rows[dt.Rows.Count-1]["id"].ToString());
        }
    }



Естественно, что сообщения не добавляются (append), а перезаписываются (если имеются), а если новых нет, то вообще сбрасываются, потому что PlaceHolder не сохраняет своего состояния. Но дальше я подумал, что даже сохранение состояния (ViewState или ControlState) - это совершенно не то, что нужно. Т.к. довольно глупо передавать на сервер ViewState с сообщениями из чата, чтобы обратно их же загрузить клиенту, добавив пару новых. Примерно по той же причине нет смысла хранить их и на сервере.

А вопрос такой:
Как подсасывать сообщения с помощью Timer`a и UpdatePanel`и, сохраняя при этом уже полученные на клиенте без некрасивых лишних движений?
...
Рейтинг: 0 / 0
18.06.2014, 17:30
    #38673371
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Loknar,
ну а что тут, создаете таймер
Код: javascript
1.
2.
3.
4.
5.
6.
 jQuery(document).ready(function () {
        window.setInterval(function () {
           //тут делаете запрос на сервер нативно или через форму
            //$("#MyForm").submit();
        }, 10000);//10000 - интервал
    });
...
Рейтинг: 0 / 0
18.06.2014, 17:33
    #38673375
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
емое
автор protected void timer1_Tick(object sender, EventArgs e)
таймер то вам зачем? все делает запрос с клиента, он и сежачек вытаскивает.
одна функция на сервере и больше ничего...
...
Рейтинг: 0 / 0
18.06.2014, 17:44
    #38673396
Loknar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Где-то в степиемое
автор protected void timer1_Tick(object sender, EventArgs e)
таймер то вам зачем? все делает запрос с клиента, он и сежачек вытаскивает.
одна функция на сервере и больше ничего...

Эммм...

А как делать запрос на проверку "Есть ли новые сообщения", если не по таймеру???

Насколько я понимаю, клиент может получить что-либо только если отправляет запрос. А сделать он это может либо что-то нажав, либо же по таймеру.

Может быть, конечно, я чего-то не понимаю, но это же чат. Пользователь не будет спамить кнопку "обновить", чтобы посмотреть, что там на странице изменилось.
...
Рейтинг: 0 / 0
18.06.2014, 17:52
    #38673410
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Loknar,
Вы не доезжаете, на странице div, таймер, скрытое поле для метки последнего сообщения ( на любителя) и больше ничего ( давай уберем панель ввода сообщений)
клиент открыл страницу, с сервера пришел див заполненный сообщениями для него на данный момент, и метка последнего сообщения,
через каждые 10 сек, страница посылает запрос с меткой на сервер, если появились сообщения она добавляет их в див и меняет метку, если нет - ничего не предпринимает, можно без метки, тогда будет излишний контент для передачи. и дерганье дива.
...
Рейтинг: 0 / 0
18.06.2014, 18:07
    #38673440
Loknar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Где-то в степиLoknar,
Вы не доезжаете, на странице div, таймер, скрытое поле для метки последнего сообщения ( на любителя) и больше ничего ( давай уберем панель ввода сообщений)
клиент открыл страницу, с сервера пришел див заполненный сообщениями для него на данный момент, и метка последнего сообщения,
через каждые 10 сек, страница посылает запрос с меткой на сервер, если появились сообщения она добавляет их в див и меняет метку, если нет - ничего не предпринимает, можно без метки, тогда будет излишний контент для передачи. и дерганье дива.

Конечно, это будет работать. Но здесь вообще получается, что мы отправляем и получаем страницу целиком, а я как раз хочу сэкономить, для этого я и использую UpdatePanel. При этом, заполняя предложенный div мы непременно столкнёмся с тем, что будем отправлять и принимать весь его ViewState, а я хочу сэкономить даже на этом.
...
Рейтинг: 0 / 0
18.06.2014, 18:15
    #38673455
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Loknar,
откуда ты взял что он будет отправлять страницу целиком? аджаксом нативным ты будешь только отправлять метку, и больше ничего.
а принимать только свежие записи...
...
Рейтинг: 0 / 0
18.06.2014, 18:16
    #38673457
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Loknar,
Засунь свою панель обновления куда подальше, и забудь ее как страшный сон, это атавизм..
...
Рейтинг: 0 / 0
19.06.2014, 09:47
    #38673865
Loknar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся
Где-то в степиLoknar,
откуда ты взял что он будет отправлять страницу целиком? аджаксом нативным ты будешь только отправлять метку, и больше ничего.
а принимать только свежие записи...
Да, кажется, теперь я понял, что имелось в виду.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как связать AJAX, Timer, UpdatePanel и контролы, в ней находящиеся / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]