2012-05-24 5 views
5

Quiero capturar los valores anteriores dentro de un modelo para poder compararlos con los nuevos valores después de la presentación, y crear registros de auditoría de los cambios que realiza un usuario.¿Captura valores antiguos para el modelo en MVC3?

Supongo que hacerlo con cuadros de entrada ocultos con propiedades duplicadas de valores antiguos sería de una sola manera. ¿Pero se pregunta si hay otras buenas alternativas?

Gracias

+2

¿Por qué no simplemente comparar el objeto en la base de datos con el objeto enviado antes de aplicar los cambios? – yoozer8

+0

Necesito capturar el ID de usuario de la persona que actualiza el registro, además el código actualiza todo el registro, en lugar de solo la fila que se está actualizando (creo que enumeré los datos incorrectamente). – stats101

Respuesta

9

En el método de guardar, sólo tiene que ir y obtener el objeto original a partir de la base de datos antes de guardar los cambios, entonces usted tiene sus valores antiguos y nuevos para comparar contra? :)

+0

Hmm ... ¡parece una buena idea! Poco preocupado por el impacto en el rendimiento de consultas adicionales a la base de datos. también si la actualización falla por alguna razón, tendría una entrada de auditoría para ello. – stats101

+0

¿Realización de consultas adicionales? ¿Cuántas entradas quieres consultar? Puede consultar la base de datos una vez colocando todos los ID en una colección, luego seleccionando de la base de datos donde está la ID en esa lista de valores, solo 1 consulta incluso para 100 elementos diferentes :) – mattytommo

+4

@ stats101: No optimice algo no tienes idea creará un cuello de botella para ti. Eso es solo perder el tiempo. –

1

Exactamente lo mattytommo dice que es el método preferido en todo

Instantiate nueva vista de modelo para la creación de una nueva entidad

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

mensaje cambia de nuevo

[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

Usted también podría tienda el modelo original en la bolsa de vista y hacer algo como esto ...

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

no he tenido la oportunidad de probar esto, sólo una teoría :)

2

Esto suena como la auditoría estándar. No debe preocuparse por lo que ha cambiado, simplemente capturar TODO y quién hizo el cambio. A menos que haya algún tipo de informe en tiempo real que deba hacerse.

posibles implementaciones de auditoría:

CQRS, en pocas palabras, hace un seguimiento de cada cambio a un objeto dado. La desventaja es que es una arquitectura que está más involucrada en la implementación.

The Rolling ledger. Cada inserción es una nueva fila en la base de datos. La fila más actual se usa para fines de visualización, pero con cada actualización, se inserta una nueva fila en la base de datos.

Otro enfoque más es guardarlo en una tabla de auditoría.

Todos hacen el trabajo.

Cuestiones relacionadas