2012-05-24 18 views
5

Desidero acquisire i vecchi valori all'interno di un modello in modo da poterli confrontare con i nuovi valori dopo l'invio e creare registri di controllo delle modifiche apportate da un utente.Acquisizione di valori precedenti per il modello in MVC3?

La mia ipotesi lo sta facendo con caselle di input nascoste con proprietà del valore vecchio duplicate sarebbe unidirezionale. Ma chiedendosi se ci sono altre buone alternative?

Grazie

+2

Perché non confrontare l'oggetto nel db con l'oggetto inviato prima di applicare le modifiche? – yoozer8

+0

Devo acquisire l'id utente della persona che aggiorna il record, inoltre il codice aggiorna l'intero record, anziché solo la riga in fase di aggiornamento (penso di aver associato i dati in modo errato). – stats101

risposta

9

Nel metodo salvare, basta andare a prendere l'oggetto originale dal database prima salvare le modifiche, quindi avete i vostri vecchi e nuovi valori da confrontare? :)

+0

Hmm .. sembra una buona idea! un po 'preoccupato per il calo di prestazioni di query aggiuntive al database. anche se l'aggiornamento fallisce per qualsiasi motivo, avrebbe una voce di controllo per questo. – stats101

+0

Prestazioni di ulteriori domande? Quante voci vuoi interrogare? Potresti semplicemente interrogare il database una volta mettendo tutti gli ID in una raccolta, quindi selezionando dal database dove l'ID si trova in quell'elenco di valori, solo 1 query per anche 100 elementi diversi :) – mattytommo

+4

@ stats101: Non ottimizzare qualcosa non hai idea creerà un collo di bottiglia per te. Sta solo perdendo tempo. –

1

Esattamente quello mattytommo dice è il metodo preferito in tutto

un'istanza di nuovo vista del modello per la creazione di una nuova entità

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

messaggio cambia di nuovo

[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

Si potrebbe anche negozio il modello originale nella borsa vista e fare qualcosa di simile ...

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

Non ho avuto la possibilità di testare questo, solo una teoria :)

2

Questo suona come controllo standard. Non dovresti preoccuparti di ciò che è cambiato, semplicemente catturare TUTTO e chi ha apportato la modifica. A meno che non ci sia una sorta di report in tempo reale che deve essere fatto.

possibili implementazioni di revisione:

CQRS, in poche parole si tiene traccia di ogni modifica a un dato oggetto. Il rovescio della medaglia è che è un'architettura che è più coinvolta da implementare.

Il libro mastro. Ogni inserto è una nuova riga nel database. La riga più recente viene utilizzata per la visualizzazione, ma con ogni aggiornamento, una nuova riga viene inserita nel database.

Un altro approccio è quello di salvarlo in una tabella di controllo.

Tutto il lavoro svolto.

Problemi correlati