2015-09-11 3 views
0

Предисловие: Я пошел дальше и использовал 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); 
} 

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

Как исправить это, связав отправку формы с индикатором выполнения?

ответ

1

Я реализовал аналогичную функциональность для обеспечения обратной связи при объединении нескольких выходов ssrs pdf в один файл. Я должен был предоставить некоторую обратную связь пользователю во время процесса. Это была боль, но я узнал, что способ .NET любит сериализовать доступ к сеансам мешает возврату обратных вызовов. Возможно, вы столкнулись с той же проблемой.

My soultion to the problem, указанная John Saunders в этом question, заключалась в том, чтобы просто отключить состояние сеанса для метода контроллера клиентской последующей обратной передачи.

//IMPORTANT - NORMAL PROGRESS STATE SERIALIZES ACCESS TO SESSIONS - All callbacks are returned only after the controller method returns 
[SessionState(SessionStateBehavior.ReadOnly)] 
public class MyProgressCallbackClass 
{ 
    ... 
} 
+0

Невозможно иметь аннотацию данных SessionState в описании функции. По-видимому, это разрешено только в декларации класса ... В любом случае, похоже, это решило. Спасибо :) – Ortund

+0

Doh! Это только аннотация, основанная на классе. –

+0

Теперь, как реплицировать это на все (например, клики ActionLink, а также формы) hmmm ... – Ortund

Смежные вопросы