У меня есть список действий, которые должны выполнять представители компании, и мне нравится открывать таймер, если он находится на редактировании в течение X минут. и все 10 минут мне нравится страница, которую нужно обновить.Разный таймер для каждого элемента в списке на ViewModel
проблема заключается в том, что многие агенты компании могут получить доступ и редактировать эти действия. , поэтому мне нравится просто покрасить элемент на моем представлении, но если агент «спящий» для этого X минут - поле underProcess сбрасывается на false;
Итак, я начинаю с добавления в свою модель поля, которые говорят мне, что это действие «UnderProcess» (я обожаю CodeFirst :) И добавляю в ViewModel статический словарь на редактирование, которое я получаю и добавляю строку с kay-actionID и DateTime редактирования. После этого на мой взгляд на foreach if item.UnderProcess style = color: red .. После редактирования меня удаляют из словаря и изменяют флаг bool.
Но это не работает - он остается красным после этого X минут, Я думаю, что проблема в этом статическом словаре, потому что когда я отлаживаю его, он всегда пуст.
Hare Мои ViewModel:
public class AgentActionViewModel
{
public SupplierAction Action { get; set; }
public List<SupplierAction> Actions { get; set; }//= new List<SupplierAction>();
public static Dictionary<int, DateTime> UnderProcessFrom;
public static AgentActionViewModel()
{
UnderProcessFrom = new Dictionary<int, DateTime>();
}
}
Контроллер:
Index
[SupplierAuthorization]
public ActionResult AgentAction(..)
{
Response.AddHeader("Refresh", (MINUTES*60).ToString());
List<SupplierAction> actions = db.SupplierActions.ToList();
bool flag = false;
var collection = AgentActionViewModel.UnderProcessFrom.Keys;
foreach (var aId in collection)
{
if (AgentActionViewModel.UnderProcessFrom[aId].AddMinutes(MINUTES) <= DateTime.Now)
{
AgentActionViewModel.UnderProcessFrom.Remove(aId);
var action = actions.Find(a=>a.SupplierActionID == aId);
action.UnderProcess = false;
db.Entry(action).State = EntityState.Modified;
}
}
if(flag)
db.SaveChanges();
...
var vm = new AgentActionViewModel();
vm.Actions = actions.OrderByDescending(d => d.RequestDate).ToList();
return View(vm);
}
GET Edit:
[SupplierAuthorization]
public ActionResult Edit(int id = -1)
{
try
{
...
if (!a.UnderProcess)
{
a.UnderProcess = true;
db.Entry(a).State = EntityState.Modified;
db.SaveChanges();
AgentActionViewModel.UnderProcessFrom.Add(id, DateTime.Now);
}
...
}
catch (Exception ex)
{
....
if (a.UnderProcess)
{
a.UnderProcess = false;
db.Entry(a).State = EntityState.Modified;
db.SaveChanges();
AgentActionViewModel.UnderProcessFrom.Remove(id);
}
.....
}
...
}
сообщение Edit:
.....
if (vm.Action.UnderProcess)
{
vm.Action.UnderProcess = false;
AgentActionViewModel.UnderProcessFrom.Remove(vm.ActionID);
}
.....
Мой Вид:
@model oCc.IPToGo.ViewModel.AgentActionViewModel
....
<tbody>
@foreach (var item in Model.Actions)
{
<tr style="@(item.UnderProcess ? "color:red" : "")">
<td>
.....
10x извините за мой плохой английский =)
Что вы подразумеваете под «открыть таймер»? –
@PeterRitchie, То есть, когда представитель пришел к редактированию, я имею в виду, что он получил страницу редактирования, я добавляю ActionID в словарь и время, когда он начал редактировать, и все обновления проверяю, как прошло время прохождения, как вы можете см. в разделе «Получить редактирование» - контроллер ActionResult и «Index» – oCcSking