ViewModel上List中每个项目的不同计时器

时间:2013-07-17 16:44:26

标签: c# asp.net-mvc-4

我有一个公司代表需要执行的操作列表,我想在X分钟编辑时打开一个计时器。 所有10分钟,我喜欢要刷新的页面。

问题是许多公司代理可以访问和编辑这些操作。 所以我喜欢只在我的视图上着色项目,但如果代理“睡眠”为这X分钟 - underProcess字段重置为false;

所以我开始向我的模型中添加一个字段,告诉我这个Action是“UnderProcess”(我喜欢CodeFirst :)而且我在ViewModel中添加了一个静态字典,在编辑时我得到了并添加一行与kay -actionID和编辑日期时间。 之后在我对foreach的看法中如果item.UnderProcess的样式=颜色:红色.. 编辑后的课程我从字典中删除并更改bool标志。

但那不行 - 在这X分钟后它保持红色, 我认为问题出在这个静态字典上,因为当我调试它时总是空的。

Hare My 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>();
    }
}

控制器:

索引

[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);
    }

获取编辑:

    [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);
            }
            .....
        }
    ...
    }

发布编辑:

.....
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抱歉我的英语不好=)

1 个答案:

答案 0 :(得分:1)

使用静态内存作为Web应用程序中的存储库是一个坏主意,即使存储库是短期的。

主要原因是内存存储库无法扩展 - 如果您在多进程地形或多机器拓扑中运行服务器 - 内存未共享,您的计时器也不会被共享。< / p>

此外,当服务器重新启动时 - 内存已经消失,您将丢失信息。

我建议你使用一个更可扩展的存储库,如果你不能成为数据库的一部分,可能会使用memcached

至少,它可以更容易地调试你的问题。