2012-04-04 1 views
0

私のクライアント側のjqGridに取り込むデータの大きなリストを取得します。セッションではなくキャッシュから読み込まれたグリッド上のチェック済みの行を永続化するにはどうすればよいですか?

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

このグリッドは、ユーザーが処理のためにレコードをチェックすることができます:多くの人々がそれを使用するので、私は、その後、キャッシュに格納

List<MyData> lotsOfRecords = getData(); 

私が最初に考えたのは、オブジェクト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 
}; 

だろう解決策ですが、オブジェクトに多くのフィールドがあり、同様の方法で数ページにわたって使用すると、クリーナー・デザイン・パターンがあると考えています。どんな提案も大歓迎です。前もって感謝します!

Btw、私の現在の環境はjQuery/UIとjqGridのASP.NET MVC 3です。

答えて

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

なぜオブジェクトを「結合する」のが難しいのか分かりません。あなたは、単にこれを行うことができます:あなたのビューモデルで使用すると、2つの別々のプロパティとしてオブジェクトのリストや辞書を持つことができ、

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

、そしてとき:

public class SelectableDataObject 
{ 

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

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

} 

を次に、あなただけのこの操作を行うことができますビュー内のオブジェクトのリストを反復してグリッドに移入すると、Idが存在する場合は辞書をチェックし、それに基づいてチェック/チェックを外すことができます。このやり方はやや鈍いですが、うまくいくはずです。

いずれにしても、あなたの辞書のアイデアは完全にうまくいくと思います。違いは唯一のものは選択されたIDのIDを保存することです。

+0

右、私はそのようにそれを組み合わせることができ、それはレイヤーを追加します。おそらく、私はjqueryの '$ .extend()'メソッドで甘やかされています。私は小道具をすべて同じネスティングレベルでしたかった。 – IronicMuffin

+0

@IronicMuffinもちろん、C#のような静的言語では不可能なことは明らかですが、あなたが本当に「1つのレイヤー」(私は正直言って必要ではないと思う)を望むなら、元のクラスのすべてのプロパティを持つ新しいクラスを作成できます、および1つのブール値のプロパティ。 AutoMapperを使用して、古いオブジェクトから新しいオブジェクトを構築することができます。あなたが私に尋ねるならば余計に、それはあなたが得ることができる最も近いものです。 – BFree

+0

右...不可能/簡単な解決策はありません。それについての洞察をいただきありがとうございます。 – IronicMuffin

関連する問題