0

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

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

因此,我首先向我的模型添加一个字段,该字段告诉我此操作是“UnderProcess”(我喜欢 CodeFirst :) 我向 ViewModel 添加了一个静态字典,在编辑时我得到了 tare 并添加了一行带有 kay-actionID 和编辑的日期时间。之后,在我对 foreach 的看法中,如果 item.UnderProcess 样式 = 颜色:红色 .. 编辑后的课程我从字典中删除并更改布尔标志。

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

野兔我的 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>
          .....

10 倍对不起我的英语不好 =)

4

1 回答 1

1

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

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

此外,当服务器重新启动时 - 内存随之消失,您会丢失信息。

我建议您使用更具可扩展性的存储库,也许memcached如果您不将它作为数据库的一部分。

至少,它会使调试问题变得更容易。

于 2014-04-12T09:05:52.583 回答