0

我得到大量数据以填充到客户端的 jqGrid 中。

List<MyData> lotsOfRecords = getData();

然后我将其存储在缓存中,因为很多人会使用它:

Cache["SharedData"].Add(lotsOfRecords);

此网格允许用户检查记录以进行处理。我想保留作为用户排序、过滤器、页面等检查的记录。

我的第一个想法是为对象添加一个属性bool Selected { get; set; }MyData并在有人检查字段时切换它。显然,这是行不通的,因为这是一个共享缓存。我不想让 Joe User 检查 Bill User 不想检查的东西。

下一个想法是存储一个Dictionary<int, bool>会话中,它将记录的 id 映射到检查状态。这还不错,但由于没有简单的方法在 .NET 中组合对象,我看不到一个干净的方法可以在没有笨重的匿名对象的情况下将其发送到我的网格:

return lotsOfRecords.Select(record => {
     record.Id,
     record.Name,
     ...
     myDictionary[record.Id] // true/false for checked
};

那将是一个解决方案,但考虑到我的对象中有很多字段并在几页中以类似的方式使用它,我希望有一个更简洁的设计模式。欢迎任何建议。提前致谢!

顺便说一句,我当前的环境是带有 jQ​​uery/UI 和 jqGrid 的 ASP.NET MVC 3。

4

2 回答 2

1

我不确定您为什么认为“组合”对象很困难。你可以简单地这样做:

public class SelectableDataObject
{

   public SelectableDataObject(MyDataObject obj)
   {
      this.DataObject = obj;
   }

   public MyDataObject DataObject { get; private set; }
   public bool Selected {get;set;}

}

然后你可以这样做:

return lotsOfRecords.Select(record => {
     return new SelectableDataObject(record){Selected = myDictionary.ContainsKey(record.Id)}
};

或者,在您的视图模型中,您可以将对象列表和字典作为两个单独的属性,当您在视图中迭代对象列表以填充网格时,您可以检查字典是否存在 Id 并选中/取消选中基于此。这种方式有点笨拙,但应该可以。

无论哪种方式,我认为您的字典想法非常好,我唯一不同的是只存储所选ID的ID,这样您就只为每个用户存储一个子集。

于 2012-04-04T21:29:23.603 回答
1

您可能正在缓存列表,但选择需要特定于用户。我建议每次回发页面时都构建一个选定索引的列表,并存储列表会话。

这是我们用来在用户浏览结果时记住选择的函数:

/// <summary>
/// Iterates through items in the grid and updates the selected vendor 
/// list with any selections or deselections on the current page
/// </summary>
private void UpdateSelectedItems()
{
    var selectedVendors = new List<int>();

    foreach (GridItem Item in grdVendors.Items)
    {
        if (Item is GridDataItem)
        {
            int VendorID = (int)((GridDataItem)Item).GetDataKeyValue("SupplierID");
            if (Item.Selected)
            {
                if (!selectedVendors.Contains(VendorID))
                    selectedVendors.Add(VendorID);
                continue;
            }

            selectedVendors.Remove(VendorID);
        }
    }            
}
于 2012-04-04T21:54:57.550 回答