2013-02-25 3 views
1

Используя MVC3, C#, JQuery, Ajax ++Асинхронный прогресс бар на петле

Мой HTML

<div> 
    <a href="#" id="startProcess">Start Long Running Process</a> 
</div> 
<br /> 
<div id="statusBorder"> 
    <div id="statusFill"> 
    </div> 
</div> 

Javascript часть часть HTML

var uniqueId = '<%= Guid.NewGuid().ToString() %>'; 

    $(document).ready(function (event) { 
     $('#startProcess').click(function() { 
      $.post("SendToDB/StartLongRunningProcess", { id: uniqueId, 
           //other parameters to be inserted like textbox 

                  }, function() { 
       $('#statusBorder').show(); 
       getStatus(); 
      }); 
      event.preventDefault; 
     }); 
    }); 

    function getStatus() { 
     var url = 'SendToDB/GetCurrentProgress'; 
     $.get(url, function (data) { 
      if (data != "100") { 
       $('#status').html(data); 
       $('#statusFill').width(data); 
       window.setTimeout("getStatus()", 100); 
      } 
      else { 
       $('#status').html("Done"); 
       $('#statusBorder').hide(); 
       alert("The Long process has finished"); 
      }; 
     }); 
    } 

Это контроллер ,

//Some global variables. I know it is not "good practice" but it works. 
    private static int _GlobalSentProgress = 0; 
    private static int _GlobalUsersSelected = 0; 

    public void StartLongRunningProcess(string id, 
             //other parameters 
             ) 
    { 
     int percentDone = 0; 
     int sent = 0;    

     IEnumerable<BatchListModel> users; 

     users = new UserService(_userRepository.Session).GetUsers(
       //several parameters) 

     foreach (var c in users) 
     { 
       var usr = _userRepository.LoadByID(c.ID); 

       var message = new DbLog 
       { 
        //insert parameters 
       }; 

       _DbLogRepository.Save(message); 
       sent++; 

       double _GlobalSentProgress = (double)sent/(double)_GlobalUsersSelected * 100; 

       if (percentDone < 100) 
       { 
        percentDone = Convert.ToInt32(_GlobalSentProgress); 
     } 

//this is supposed to give the current progress to the "GetStatus" in the javascript 
public int GetCurrentProgress() 
    { 
     return _GlobalSentProgress; 
    } 

В настоящий момент div с индикатором хода никогда не появляется. Это честно вроде сломан. Но я надеюсь, вы понимаете мою логику.

В цикле делать вставки, у меня есть этот расчет:

double _GlobalSentProgress = (double)sent/(double)_GlobalUsersSelected * 100; 

Затем я конвертировать _GlobalSentProgress к нормальному междунар в

percentDone = Convert.ToInt32(_GlobalSentProgress); 

так он больше не имеет каких-либо знаков после запятой любые дольше.

Если бы я мог отправить эту переменную «percentDone» или «_GlobalSentProgress» (которая отлично показывает, сколько процентов я пришла во вставке) асинхронно в переменную «data» в javascript каждый раз, когда она зацикливается, это Работа. Тогда «данные» будут делать это «statusFill» все время и правильно показывать панель. Это логика, которую я использую.

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

У кого-нибудь есть предложение о том, как я могу это сделать?

ответ

1

Редактировать 2: Внешний div имеет статус statusBorder not status.