0

クライアント側の jqGrid に入力するデータの大きなリストを取得します。

List<MyData> lotsOfRecords = getData();

多くの人が使用するため、キャッシュに保存します。

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

このグリッドにより、ユーザーは処理対象のレコードを確認できます。ユーザーの並べ替え、フィルター、ページなどでチェックされるレコードを永続化したいと考えています。

bool Selected { get; set; }私が最初に考えたのは、オブジェクトにプロパティを追加し、MyData誰かがフィールドをチェックするたびにそれを切り替えることでした。これは共有キャッシュであるため、明らかに機能しません。私は、Bill User がチェックしたくないものを Joe User にチェックさせたくありません。

Dictionary<int, bool>次のアイデアは、レコードの ID をチェック済みステータスにマップするセッション内を保存することでした。これは悪くはありませんでしたが、.NET でオブジェクトを結合する簡単な方法がないため、不格好な匿名オブジェクトなしでそれをグリッドに送信するクリーンな方法がわかりません。

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

それは解決策ですが、オブジェクトに多くのフィールドがあり、いくつかのページで同様の方法で使用することを考えると、よりクリーンなデザイン パターンがあることを願っています。どんな提案でも大歓迎です。前もって感謝します!

ところで、私の現在の環境は、jQuery/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)}
};

または、ビューモデルで、オブジェクトのリストとディクショナリを2つの別個のプロパティとして持つことができます。ビュー内のオブジェクトのリストを繰り返してグリッドにデータを入力するときに、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 に答える