Предисловие: Я пошел дальше и использовал this as the basis for what I'm doing.Индикатор выполнения для выполнения длительных задач в MVC 5
Я пытаюсь дать моему пользователю некоторые указания, что подача формы фактически что-то делает.
Моя идея была чем-то очень похожа на то, что сделал YouTube ... У вас есть панель в верхней части страницы, расширяющаяся по ширине на странице, чтобы отразить ход выполнения выполняемой задачи.
Вот JQuery, который отправляет форму:
// Task Progress Indication
function update(taskId, status) {
var e = $("#" + taskId);
if (status != "Completed") {
// increase the width of the progress indicator
e.css("width", status);
}
else {
e.hide();
}
}
$("form").submit(function (e) {
// start indicating progress
e.preventDefault();
$.post("Home/Start", {}, function (taskId) {
// periodically update monitor
var intervalId = setInterval(function() {
$.post("Home/Progress", { id: taskId }, function (progress) {
if (progress >= 100) {
update(taskId, "Completed");
clearInterval(intervalId);
}
else {
update(taskId, progress + "%");
}
});
}, 100);
});
// end indicating progress
// this is the post of the form to the Controller
$.post($(this).attr("action"), $(this).serialize(), function (data) {
if (!data.IsOK) { // this is some error handling that I need to fix still
$("#modalTitle").html(data.Title);
$("#modalMessage").html(data.Message);
$("#modalDetail").html(data.Error).hide();
$("#modalDialog").css("display", "block");
$("#modalBackground").css("display", "block");
}
else {
window.location.href = '@Url.Content("~/")';
}
return;
});
return false;
});
На мой контроллер у меня есть следующие ActionResult, которые являются для обработки обновления индикатора прогресса.
private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();
public ActionResult Start()
{
var taskid = Guid.NewGuid();
tasks.Add(taskid, 0);
Task.Factory.StartNew(() =>
{
for (var i = 0; i <= 100; i++)
{
tasks[taskid] = i; // update task progress
Thread.Sleep(50); // simulate long running operation
}
tasks.Remove(taskid);
});
return Json(taskid);
}
public ActionResult Progress(Guid id)
{
return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
}
Я могу быть неправ здесь, но я думаю, что причина, я не вижу ничего на странице, что нет никакой связи здесь между индикатором процесса и формы представления.
Как исправить это, связав отправку формы с индикатором выполнения?
Невозможно иметь аннотацию данных SessionState в описании функции. По-видимому, это разрешено только в декларации класса ... В любом случае, похоже, это решило. Спасибо :) – Ortund
Doh! Это только аннотация, основанная на классе. –
Теперь, как реплицировать это на все (например, клики ActionLink, а также формы) hmmm ... – Ortund