2013-07-17 2 views
0

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

+0

Что вы подразумеваете под «открыть таймер»? –

+0

@PeterRitchie, То есть, когда представитель пришел к редактированию, я имею в виду, что он получил страницу редактирования, я добавляю ActionID в словарь и время, когда он начал редактировать, и все обновления проверяю, как прошло время прохождения, как вы можете см. в разделе «Получить редактирование» - контроллер ActionResult и «Index» – oCcSking

ответ

1

Использование статической памяти в качестве хранилища в веб-приложение, это плохая идея, даже если хранилище для в ближайщем будущем.

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

Также, когда сервер перезагружен - память ушла с него, и вы теряете информацию.

Предлагаю вам использовать более рискованный репозиторий, возможно, memcached, если вы не являетесь частью вашей базы данных.

По меньшей мере, было бы проще отладить вашу проблему.

+0

10x @Uri, еще один, вы считаете, что если я просто напишу на скрытом входе, время и всегда проверяю, будет ли эймэйн меньше 10 минут, если так, чтобы цвет, лучший способ или путь БД? – oCcSking

+1

Это действительно зависит от вашего прецедента - это состояние клиента или состояние сервера? Что должно произойти, если пользователь никогда не отправляет форму? Что произойдет, если другой пользователь изменит состояние элемента? Если вы можете ответить на эти вопросы с помощью клиентского решения - продолжайте и реализуйте его –

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