Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> asp.net ajax progressbar, Нужен совет 
:(
    Опции темы
dmlk
Дата 23.7.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Пишу ajax progress bar контрол. Решил реализовать это с помощью серверного обработчика (handler), коллекции Cache и ajax запросов по таймеру.

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

Страница:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
 <title></title>
 <script type="text/javascript">
 var stop;
 function createXMLHttp() {
  if (typeof XMLHttpRequest === 'undefined') {
  XMLHttpRequest = function () {
   try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
   catch (e) { }
   try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
   catch (e) { }
   try { return new ActiveXObject("Msxml2.XMLHTTP"); }
   catch (e) { }
   try { return new ActiveXObject("Microsoft.XMLHTTP"); }
   catch (e) { }
   throw new Error("This browser does not support XMLHttpRequest.");
  };
  }
  return new XMLHttpRequest();
 }

 function progressbar(a, b) {
  document.getElementById("Button1").disabled = true;

  var xmlHttp = createXMLHttp();
  if (xmlHttp) {
  xmlHttp.open('GET', 'handler');
  xmlHttp.onreadystatechange = function () {
   if (xmlHttp.readyState == 4) {
   if (xmlHttp.status == 200) {
    var response = xmlHttp.responseText;
    if (response == "stop") {
    stopTimer();
    }
    else {
    document.getElementById('txt').value = xmlHttp.responseText;
    }
   }
   }
  }
  xmlHttp.send(null);
  }
 }

 function exec() {
  stop = setInterval("progressbar(1,2)", 1000);
 }

 function stopTimer() {
  clearInterval(stop);
 } 

 </script>
</head>
<body>
 <form id="form1" runat="server" >
 <div>
 </div>
 <asp:TextBox runat="server" ID="txt"></asp:TextBox>
 <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" OnClientClick="exec(); " />
 </form>
</body>
</html>


Серверный обработчик, который вызывается при запросе к адресу "handler" (это временный адрес):

Код

public class Handler : IHttpHandler
{
 public void ProcessRequest(HttpContext context)
 {
 context.Response.ContentType = "text/plain";

 if (context.Cache["_cache"] != null)
 {
  if (context.Cache["_cache"].ToString() == "stop")
  {
  context.Response.Write("stop");
  }
  else
  {
  context.Response.Write(context.Cache["_cache"].ToString());
  }

 }
 else
  context.Response.Write((-2).ToString());
 }

 public bool IsReusable
 {
 get { return true; }
 }
}


и непосредственная сама функция, прогресс которой будет отображаться (Sleep выступает в роли долго выполняемой функции): 

Код

 protected void Button1_Click(object sender, EventArgs e)
 {
 for (int i = 0; i < 100; i++)
 {
  HttpContext.Current.Cache.Insert("_cache", i);
  Thread.Sleep(1000);
 }
 Cache["_cache"] = "stop";
 }


Cache очищается в Page_Load.

Два вопроса:

1. Иногда проскакивают странные результаты от хэндлера (например числа, большие чем счетчик итераций), как от этого избавиться.

2. На сколько вообще правильный такой подход?, как можно улучшить данный код?

Заранее спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.