2012-03-06 4 views
2

Нам нужно записать конкретное действие в проект MVC 3. Таблица базы данных будет хранить логи что-то вроде:Аудит/Вход в систему ASP.NET MVC3

«User [SessionUserHere ...] изменил [Имя] [LastName] [OtherAttributesHere ...] значения [ChangedEmployeeHere ...] «

Мне нужно узнать, какие атрибуты модели изменились и какие из них сохраняют свои первоначальные значения. Есть ли способ отслеживать, какие атрибуты Модели изменились?

В MVC3 doing Audit trail предлагается триггер базы данных; но мы используем Sql Server Compact для этого проекта.

Спасибо ...

ответ

1

Вы могли бы сделать ревизию в коде, а не базы данных. В обработчике HttpPost получите исходное значение и сравните объекты с помощью функции аудита. У меня есть реализация домашнего пивоварения, но это делает аналогичную вещь Compare .NET Objects.

Это означает, что вы можете сделать следующее:

var original = GetDatabaseRecord(xx); 
var newRec = GetFormSubmission(); // However you do this 

var auditor = new CompareObjects(); 

if (auditor.Compare(original, newRec)) 
{ 
    foreach (var diff in auditor.Differences) 
    { 
     // work through the deltas 
    } 
} 
else 
{ 
    // Nothing changed! 
} 

Моей собственная версия возвращает структуру:

  • Названия (например, "Issue.Priority")
  • Change (ChangedValue, OnlyLeft, OnlyRight)
  • Старая стоимость
  • Новое значение

Указанная ссылка может быть достаточной для вас или действовать как отправная точка.

1

Я создал библиотеку, чтобы сделать это и предоставить некоторые дополнительные метаданные. Он полагается на MVC ModelMetadata и DataAnnotations, чтобы предоставить «читаемую версию» diff для нетехнических пользователей.

https://github.com/paultyng/ObjectDiff

Указанные объекты, такие как (без метаданных очевидно):

var before = new 
{ 
    Property1 = "", 
    MultilineText = "abc\ndef\nghi", 
    ChildObject = new { ChildProperty = 7 }, 
    List = new string[] { "a", "b" } 
}; 

var after = new 
{ 
    Property1 = (string)null, 
    MultilineText = "123\n456", 
    NotPreviouslyExisting = "abc", 
    ChildObject = new { ChildProperty = 6 }, 
    List = new string[] { "b", "c" } 
}; 

Было бы вывести что-то вроде:

ChildObject - ChildProperty: '6', was '7' 
List - [2, added]: 'c', was not present 
List - [removed]: No value present, was 'a' 
MultilineText: 
----- 
123 
456 
----- 
was 
----- 
abc 
def 
ghi 
----- 
NotPreviouslyExisting: 'abc', was not present 
+0

это имеет какой-либо поддержки для перевода или я развернуть код и изменить его? –

Смежные вопросы