モデル内の古い値をキャプチャして、送信後に新しい値と比較し、ユーザーが行った変更の監査ログを作成できるようにしたいと考えています。
私の推測では、古い値のプロパティが重複している非表示の入力ボックスでそれを行うのは1つの方法です。しかし、他に良い選択肢があるかどうか疑問に思っていますか?
ありがとう
モデル内の古い値をキャプチャして、送信後に新しい値と比較し、ユーザーが行った変更の監査ログを作成できるようにしたいと考えています。
私の推測では、古い値のプロパティが重複している非表示の入力ボックスでそれを行うのは1つの方法です。しかし、他に良い選択肢があるかどうか疑問に思っていますか?
ありがとう
saveメソッドでは、変更を保存する前にデータベースから元のオブジェクトを取得するだけで、古い値と新しい値を比較できますか?:)
これは標準的な監査のように聞こえます。何が変更されたかを心配する必要はありません。すべてをキャプチャし、誰が変更を加えたかを確認してください。実行する必要のあるある種のリアルタイムレポートがない限り。
可能な監査の実装:
CQRSは、一言で言えば、特定のオブジェクトへのすべての変更を追跡します。欠点は、実装がより複雑なアーキテクチャであるということです。
ローリング元帳。各挿入は、データベースの新しい行です。最新の行は表示目的で使用されますが、更新のたびに、新しい行がデータベースに挿入されます。
さらに別のアプローチは、それを監査テーブルに保存することです。
すべてが仕事を成し遂げます。
まさに mattytommo が言っていることは、あらゆる点で好ましい方法です
新しいエンティティを作成するための新しいビュー モデルをインスタンス化する
public ActionResult Edit(int id) {
var entity = new Entity(id); // have a constructor in your entity that will populate itself and return the instance of what is in the db
// map entity to ViewModel using whatever means you use
var model = new YourViewModel();
return View(model);
}
変更を投稿する
[HttpPost]
public ActionResult Edit(YourViewModel model) {
if (ModelState.IsValid) {
var entity = new YourEntity(model.ID); // re-get from db
// make your comparison here
if(model.LastUserID != entity.LastUserID // do whatever
... etc...
}
return View(model);
}
元のモデルをビューバッグに保存して、次のようにすることもできます...
// In the controller
public ActionResult DoStuff()
{
// get your model
ViewBag.OriginalModel = YourModel;
return View(YourModel);
}
// In the View
<input type="hidden" name="originalModel" value="@Html.Raw(Json.Encode(ViewBag.OriginalModel));" />
// In the controller's post...
[HttpPost]
public ActionResult DoStuff(YourModel yourModel, string originalModel)
{
// yourModel will be the posted data.
JavaScriptSerializer JSS = new JavaScriptSerializer();
YourModel origModel = JSS.Deserialize<YourModel>(originalModel);
}
私はこれをテストする機会がありませんでした.ただの理論です:)