Аудит/Вход в ASP.NET MVC3

Нам нужно зарегистрировать конкретное действие в проекте MVC 3. Таблица базы данных будет хранить журналы примерно так:

"Пользователь [SessionUserHere...] изменил значения [Имя][Фамилия][OtherAttributesHere...] из [ChangedEmployeeHere...]"

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

В MVC3, выполняющем журнал аудита, предлагается триггер базы данных; но мы используем Sql Server Compact для этого проекта.

Спасибо...


person Turkdogan Tasdelen    schedule 06.03.2012    source источник


Ответы (3)


Вы видели интерфейс INotifyPropertyChanged?

http://msdn.microsoft.com/en-us/library/ms743695.aspx

person AyKarsi    schedule 06.03.2012

Вы можете проводить аудит в коде, а не в базе данных. В обработчике HttpPost получите исходное значение и сравните объекты с помощью функции аудита. У меня есть реализация home brew, но она делает то же самое Сравнить объекты .NET.

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

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!
}

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

  • Имя (например, «Выпуск.Приоритет»)
  • Изменить (ChangedValue, OnlyLeft, OnlyRight)
  • Старое значение
  • Новое значение

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

person Ray Hayes    schedule 21.05.2012

Я создал библиотеку именно для этого и предоставил некоторые дополнительные метаданные. Он использует 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
person Paul Tyng    schedule 04.12.2012
comment
есть ли какая-либо поддержка перевода или мне нужно разветвить код и изменить его? - person Alireza Noori; 13.09.2014