2012-03-01 8 views
1

管理システムで競合の検出を実装しようとしています。つまり、アリスがページを編集しています。 Bobは同じページを編集し、Aliceの前に保存します。アリスがボブの変更を上書きしないようにするには、変更が発生したことと、自分が上書きするフィールドとボブが保存していたフィールドを知る必要があります。 (これはすべてSQLを使用しています)。管理システムでのASP.NETの競合の検出

私はオブジェクトをPage_Loadに格納しようとしましたが、ページがポストバックされると消えます。厄介なシリアライゼーションコードを書かなくてもオブジェクトを永続化する方法はありますか?あるいは実際にそれをやるより良い方法です。

答えて

2

オブジェクトがあまり複雑でない場合は、[Serializable]というマークを付けてViewStateまたはSessionStateに移動し、ポストバック後も存続します(ViewStateに挿入した場合は、後にビューステートに戻す必要があります。ポストバック、ページが再びレンダリングされる前)。

オブジェクトが少し複雑な場合、または実際にそのデータを保存しない場合は、問題のテーブルにLastUpdatedおよびLastUpdatedByの行に沿ったフィールドがあることを確認し、いつでもそれらが書き込まれるようにします更新されます。次に、あなたができることは、アリスのページをレンダリングするときに、LastUpdatedの日付を隠しフィールド(またはビューステート)に書き出すことです。

次に、保存しようとしたときに、データベースのLastUpdatedのレコードを、ページのレンダリング時に添付されたレコードと比較します。同じ場合は、更新を実行してください。それらが異なる場合は、アリスがポストバックから持って来る方法でアリスが入力したかった値があり、日付チェックからボブの変更があります。あなたはそれから望むどんなUIも表示することができます。

EDIT:ページを読み込むときにアリスが持っていた元の値を表示したい場合は、他のオプションがあります。

最初の技術者は、編集可能な各フィールドに対応するHiddenFieldを持つことです。コントロールを入力するのと同時にそれらをロードし、それを使用して元の値を表示します。

別のオプションは、あなたがそれを使用することですのObjectDataSourceを使用している場合は、ConflictDetectionの機能です:このとOldValuesParameterFormatString特性と http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.conflictdetection.aspx

、[更新機能に元の値を渡す、などでしょうコントロール更新された値

+0

私は最後の更新オプションが好きです(同じ方法でTimeStampを使用できますか?)が、BobのフィールドのどれがAliceが最初に読み込んだ値と異なるのかを知ることは困難です。何か案は?私は実際には多くのオブジェクトでこれを行う予定であり、非常に簡単に維持可能ではないため、Serializableを使用したくありません。 –

+0

追加情報は編集を参照してください。 –

+0

あなたのアイデア、素晴らしい助けをありがとう –

関連する問題