我目前正在开发一个 mvc 4 应用程序。客户希望有一个更改日志,以便他们可以查看哪些字段已更改。在编辑的情况下,它应该显示旧值和新值。如果它是删除,那么它应该显示删除了哪一行。
实现这样的目标的最佳方法是什么?
只是为了澄清..更改将是数据库中的实际数据..
即我可能有客户姓名和地址的记录..用户可能会更新地址..我需要能够查看用户更改的内容..旧数据和新数据
谢谢...
我目前正在开发一个 mvc 4 应用程序。客户希望有一个更改日志,以便他们可以查看哪些字段已更改。在编辑的情况下,它应该显示旧值和新值。如果它是删除,那么它应该显示删除了哪一行。
实现这样的目标的最佳方法是什么?
只是为了澄清..更改将是数据库中的实际数据..
即我可能有客户姓名和地址的记录..用户可能会更新地址..我需要能够查看用户更改的内容..旧数据和新数据
谢谢...
如果您想获取数据库中现有模型与修改时提交的模型之间已更改的字段列表,则可以在控制器的 Edit Post 方法中执行此操作:
IEnumerable<string> changedFields = Audit.GetPropertyDifferences(existingModel, newModel);
我创建了一个简单的函数,它返回一堆显示更改的属性的字符串:
public static class Audit
{
public static IEnumerable<string> GetPropertyDifferences<T>(this T obj1, T obj2)
{
PropertyInfo[] properties = typeof(T).GetProperties();
List<string> changes = new List<string>();
string name = string.Empty;
foreach (PropertyInfo pi in properties)
{
object value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null);
object value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null);
DisplayNameAttribute attr = (DisplayNameAttribute)pi.GetCustomAttribute(typeof(DisplayNameAttribute));
if (value1 != value2)
{
if (attr == null)
{
name = pi.Name;
}
else
{
name = attr.DisplayName;
}
if (value1 == null)
{
changes.Add(string.Format("<li>{1} was added to {0}</li>", name, value2));
}
else if (value2 == null)
{
changes.Add(string.Format("<li>{1} was removed from {0}</li>", name, value1));
}
else
{
changes.Add(string.Format("<li>{0} changed from {1} to {2}</li>", name, value1, value2));
}
}
}
return changes;
}
}
此代码检查是否在模型中设置了 DisplayName 属性,如果存在,则使用该属性代替属性名称。
然后,您可以显示这些更改或将它们保存到数据库中,如下所示:
if (changedFields.Count() != 0)
{
foreach (string i in changedFields)
{
// Do something
}
}
这通常使用数据库中的触发器来完成。您创建一个审计表,然后创建捕获每个更改并记录它们的触发器。
一篇谈论这个的文章在这里:
http://www.codeproject.com/Articles/441498/Quick-SQL-Server-Auditing-Setup
较新版本的 SQL Server 内置了审计功能,但仅限于非常昂贵的企业版。大多数人无法访问这些功能。
另一种选择,我不能说它的效果如何,是声称增加审计功能的第三方工具。例如,一个简单的谷歌搜索发现了这些: