Используя 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 очень перспективных руководства, но мне не удалось заставить его работать с моей петлей.
У кого-нибудь есть предложение о том, как я могу это сделать?