как получить счетчик функции контроллера в строке выполнения ajax asp.net mvc

69
5

Я пытаюсь получить исходный счет из функции foreach внутри результата для ответа на пост AJAX. Проблема, с которой я сталкиваюсь, заключается в том, что в моем ответе на пост я получаю общее количество всех итераций foreach, но не отдельных лиц. Цель этого - показать ход загрузки, заполнив индикатор выполнения на каждой итерации.

контроллер:

public JsonResult progressFunction(int? SystemGeneralAnnouncementId)
{

var systemGeneralAnnouncement = (SystemGeneralAnnouncementId == null) ? null : _uow.SystemGeneralAnnouncementRepository.GetById(SystemGeneralAnnouncementId.Value);
List<Status> status = new List<Status>();

if (systemGeneralAnnouncement.Statuses.Length > 0)
{
status.AddRange(systemGeneralAnnouncement.Statuses.Split(',').Select(item => (Status) Enum.Parse(typeof (Status), item)));
}

var allPocEmailAddresses = new List<InstitutionPointOfContact>();
var pocEmailAddresses = new List<InstitutionPointOfContact>();

//retrieve all Point of contact based upon selected statuses per each loop
var result = new List<InstitutionPointOfContact>();
foreach (var item in status)
{
result = _uow.InstitutionPointOfContactRepository.GetAllByStatus(item).ToList();
allPocEmailAddresses.AddRange(result);
}

// Retrieve the poc email addresses based on the who is intended to receive the email message
if (systemGeneralAnnouncement.SendToRecipients.Contains("(1) All Three POCs"))
{
pocEmailAddresses = allPocEmailAddresses;
}
else
{
if (systemGeneralAnnouncement.SendToRecipients.Contains("(2) All POCs"))
{
pocEmailAddresses.AddRange(allPocEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.Primary).ToList());
}
if (systemGeneralAnnouncement.SendToRecipients.Contains("(3) All Compliance POCs"))
{
pocEmailAddresses.AddRange(allPocEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.Secondary).ToList());
}
if (systemGeneralAnnouncement.SendToRecipients.Contains("(4) All Authorities"))
{
pocEmailAddresses.AddRange(allPocEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.SigningAuthority).ToList());
}
if (systemGeneralAnnouncement.SendToRecipients.Contains("(5) All Rate POCs"))
{
pocEmailAddresses.AddRange(allPocEmailAddresses.Where(r => r.PointOfContactType == PointOfContactTypes.TuitionRates).ToList());
}
if (systemGeneralAnnouncement.SendToRecipients.Contains("(6) Specified Email Address"))
{
var pocs = new List<InstitutionPointOfContact>();

string[] emails = systemGeneralAnnouncement.EmailAddresses.Split(',');

foreach (string email in emails)
{
var addPoc = new InstitutionPointOfContact { Email = email };

User user = _uow.UserRepository.GetByEmail(email);

if (user == null)
{
addPoc.FirstName = "Not Created Account Yet";
}
else
{
addPoc.FirstName = user.FirstName;
addPoc.LastName = user.LastName;
}

List<InstitutionPointOfContact> opeidAssociatedToUser =
_uow.InstitutionPointOfContactRepository
.GetAllPocsByEmail(email)
.ToList();

if (opeidAssociatedToUser.Count == 0)
{
addPoc.IDNumber = "N/A";
}
else
{
string[] idArray = idAssociatedToUser
.Select(x => x.IDNumber)
.ToArray();

addPoc.IDNumber = string.Join(",", opeidArray);
}
pocs.Add(addPoc);
}
pocEmailAddresses.AddRange(pocs);
}
}

ViewBag.UploadProgress = 0;
// if any poc addresses were found...
if (pocEmailAddresses.Count > 0)
{
string emailBody = WebUtility.HtmlDecode(systemGeneralAnnouncement.EmailBody);

foreach (InstitutionPointOfContact emailAddress in pocEmailAddresses.Where(x => x.Email != "" && x.Email != null).ToList())
{

string firstName = emailAddress.FirstName == null ? "" : emailAddress.FirstName.Trim();
string lastName = emailAddress.LastName == null ? "" : emailAddress.LastName.Trim();
string userName = firstName + " " + lastName;

//iterative for progress bar
ViewBag.UploadProgress++;

}
}

return Json (ViewBag.UploadProgress, JsonRequestBehavior.AllowGet);

}

AJAX:

$

(document).ready(function(){
$.ajax({
type: "POST",
url: "progressFunction",
cache: false,
cacheControl: "no-cache",
statusCode: {
500: function () {
errorWhileSavingData()
}
},
success: function (data) {
alert()
GenerateProgressBar(data);
}
});
});

Мой вопрос: могу ли я получить индивидуальный счет от контроллера (Viewbag.uploadProgress) в функции post, чтобы я мог передать его как счетчик переменных в строке выполнения?

Обновление. Для ясности я должен получить индивидуальный счет foreach (1 ~ n), а не завершенный счет, который я получаю сейчас.

Обновление 2: SingalR на самом деле не вариант в этом случае, поскольку это было бы чрезмерным для такого небольшого процесса, желаемый результат исходил из "сворачивания ваших собственных",

спросил(а) 2017-04-04T19:50:00+03:00 2 года, 10 месяцев назад
1
Решение
52

Чтобы ответить на ваш вопрос, это невозможно, учитывая текущую настройку. Хорошая попытка использования ViewBag, но ViewBag фактически не передается между контроллером и представлением до тех пор, пока действие не будет завершено и не вернется в представление. Как я уже упоминал, SignalR будет одним из способов приблизиться к этому, но будет излишним для вашего варианта использования.

ответил(а) 2017-04-04T23:39:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема