2012-05-24 21 views
5

Chcę przechwycić stare wartości w modelu, aby móc je porównać z nowymi wartościami po przesłaniu i utworzyć dzienniki inspekcji zmian wprowadzanych przez użytkownika.Przechwytywanie starych wartości dla modelu w MVC3?

Domyślam się, że robię to z ukrytymi polami wprowadzania danych z powielonymi starymi właściwościami wartości w jeden sposób. Ale zastanawiasz się, czy są jakieś inne dobre alternatywy?

Dzięki

+2

Dlaczego po prostu nie porównać obiektu w bazie danych z przesłanym obiektem przed zastosowaniem zmian? – yoozer8

+0

Potrzebuję przechwycić identyfikator użytkownika osoby aktualizującej rekord, a kod aktualizuje cały rekord, a nie tylko aktualizowany wiersz (uważam, że niepoprawnie powiązałem dane). – stats101

Odpowiedz

9

W metodzie ratować, tylko iść i dostać oryginalnego obiektu z bazy przed zapisywania zmian, to masz swoje stare i nowe wartości do porównania przeciw? :)

+0

Hmm .. brzmi jak dobry pomysł! trochę martwił się o trafność wyników dodatkowych zapytań do bazy danych. również jeśli aktualizacja nie powiedzie się z jakiegokolwiek powodu, będzie miała wpis audytu dla niego. – stats101

+0

Wykonanie dodatkowych zapytań? Ile wpisów chcesz zapytać? Możesz po prostu wysłać zapytanie do bazy danych jeden raz, umieszczając wszystkie identyfikatory w kolekcji, a następnie wybierając z bazy danych, w której identyfikator znajduje się na tej liście wartości, tylko 1 zapytanie na nawet 100 różnych elementów :) – mattytommo

+4

@ stats101: Nie optymalizuj niczego nie masz pojęcia, stworzy wąskie gardło dla ciebie. To tylko marnowanie czasu. –

1

Dokładnie co mattytommo mówi jest preferowaną metodą całym

instancji nowy model widok na utworzenie nowego podmiotu

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

post zmienia z powrotem

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

Można też sklep oryginalny model w torbie widoku i zrób coś takiego ...

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

Nie miałem okazji przetestować tego, tylko teoria :)

2

To brzmi jak standardowy audyt. Nie powinieneś martwić się o to, co się zmieniło, tylko złapać WSZYSTKO i kto dokonał zmiany. Chyba, że ​​trzeba sporządzić raportowanie w czasie rzeczywistym.

Możliwe implementacje audytorskie:

CQRS, w skrócie śledzi każdą zmianę do danego obiektu. Minusem jest architektura, która jest bardziej zaangażowana w implementację.

The Rolling ledger. Każda wstawka to nowy wiersz w bazie danych. Bieżący wiersz jest używany do wyświetlania, ale przy każdej aktualizacji nowy wiersz jest wstawiany do bazy danych.

Jeszcze innym podejściem jest zapisanie go w tabeli kontroli.

Wszystkie prace zostały wykonane.

Powiązane problemy