如何实现MVC 4更改日志?

时间:2013-10-06 23:12:00

标签: .net asp.net-mvc-3 c#-4.0 asp.net-mvc-4

我目前正在开发一个mvc 4应用程序。 客户端希望拥有更改日志,以便他们可以查看已更改的字段。在编辑的情况下,它应该显示旧值和新值。如果是删除,那么它应该显示删除了哪一行。

什么是实现这样的最佳方式?

只是为了澄清..更改将是数据库中的实际数据..

即我可能有客户名称和地址的记录......用户可能会更新地址..我需要能够查看用户更改的内容..旧数据和新数据

...谢谢

2 个答案:

答案 0 :(得分:2)

如果要获取数据库中现有模型与修改后提交的模型之间已更改的字段列表,则可以在控制器的“编辑后”方法中执行此操作:

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

答案 1 :(得分:1)

这通常使用数据库中的触发器来完成。您创建一个审计表,然后创建捕获每个更改并记录它们的触发器。

这里有一篇文章谈论这个:

http://www.codeproject.com/Articles/441498/Quick-SQL-Server-Auditing-Setup

更新版本的SQL Server内置了审计功能,但仅限于非常昂贵的企业版...大多数人无法访问这些功能。

另一种选择,我不能说它的工作情况,是声称添加审计功能的第三方工具。例如,一个简单的谷歌搜索发现了这些:

http://krell-software.com/omniaudit/

https://renholdsoftware.com/SQLTableAudit