コンテキスト:私はしばしば私たちのASP.NETページはGridViewの上のユーザーにデータを表示しなければならない状況にしてきたASP.NETのポストバック間でデータの永続化
、彼は喜ばとして彼はそれを変更してみましょう(セル上のテキストボックス)、実際に「保存ボタン」に当たったときにのみデータベースに保存します。このデータは、通常、ページ上の情報の仮想状態です。つまり、ユーザーが「保存ボタン」を押すまで、実際に保存せずにすべてを変更できます。 このような場合、常にASP.NETポストバック間で永続化する必要があるデータのリストがあります。このデータは、DataTable
のインスタンスか、またはわずかにList<Someclass>
のインスタンスです。
これを実装し、データをSession
に保存している人がよく見受けられます。そのような場合、私は通常、複数のタブを開いてナビゲートするユーザーが同じページで何度か開いてしまうという問題を抱えています。 2つの異なるタブのデータがマージされ、情報がスクランブルされるという問題を引き起こします。セッションが頻繁に使用される方法の
例:二つのタブがすでにロードされ、ユーザーされている場合について
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}
しかし、どのような:
private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}
人々頻繁にこのような何かをすることによってそれを解決しようとしますGridViewの値が変更されていて、別のページの[保存]ボタンを押してデータを保存しようとすると、何か不思議な理由がありますか?私は個人的にこのオプションを嫌っています。
これを行う他の方法は、データをViewState
に入れることです。しかし、大幅に大きなリストを保持する場合は、ページに格納されているときにページに重大な影響を与える可能性があります(HiddenField
)。
しかし、それを実現する最も良い方法は何ですか?一度、私はViewState
と一緒にSession
を使用して、ViewState
がSession
セーブしたデータをインデックスするユニークな識別子を保持すると考えました。それは、ブラウザのタブの間でデータを共有妨げる:
private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
return Session[ViewState["SomeKey"].ToString()] as List<SomeClass>;
}
set {
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
Session[ViewState["SomeKey"].ToString()] = value;
}
}
一方、それがセッションにユーザーがページを入力するたびに、データの新しいリストを格納します。これはサーバーのメモリに影響を与えます。たぶん何らかの方法で消去することができるかもしれません。
質問:
サーバーへと保守コーディングチームに少ないコストで、ブラウザ上で複数のタブのコンテキストを考慮すると、ポストバック間でのデータのようなものを永続化する最良の方法は何だろう?
更新:きれいに掲載@nunespascalとして
、一つの選択肢はSessionPageStatePersister
を使用してSession
でViewState
を保存することです。しかし残念ながらそれは私の場合の選択肢ではありません。しかし、ViewStateに保存されたUniqueIdによってインデックスされたセッションにデータを保存することは、私の最後の例とあまり変わりません。
その他のオプションはありますか?
2つ目のアプローチは、いくつかの調整が可能です:1)ViewStateではなく隠しフィールドを使用する。 ViewStateがページ上で利用可能になる前にアクセスすることができます(時には便利です)。 2)一度に保管できるアイテムの数を制限し、最も古いアイテムを廃棄するマネージャーとのセッションをラップします。もちろん、これはメモリの問題を完全に解決するわけではありませんが、ビジー状態のユーザーが何百もの大きなオブジェクト/セットをメモリに持つことを心配することなく、ユーザーがアプリケーション内で有機的に作業できるようにするためには長い道のりがあります。 –