.NET MVC通过反射获取数据修改历史记录,并插入数据表中
1.核心代码:
复制代码
1 private static void IsUpdate<T>(T old, T current, string id)
2 {
3 Model.PerFileHistory history = new Model.PerFileHistory();
4 Model.Atrributes.ModifyFields atrr = null;
5 Type type = typeof(T);
6 PropertyInfo[] propertys = type.GetProperties();
7 foreach (PropertyInfo property in propertys)
8 {
9 if (property.PropertyType.IsValueType || property.PropertyType.Name == "String")
10 {
11 if (property.PropertyType.FullName.Contains("Guid"))
12 continue;
13 //if (property.Name != "CreateUserID" && property.Name != "CreateTime" && property.Name != "ModifyUserID" && property.Name != "LastModifyTime")//排除这些字段不做判断
14 //{
15 if (property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false).Count() > 0)
16 {
17 object o1 = property.GetValue(old, null); //以前的值
18 object o2 = property.GetValue(current, null); //修改后的值
19 string str1 = o1 == null ? string.Empty : o1.ToString();
20 string str2 = o2 == null ? string.Empty : o2.ToString();
21 //判断两者是否相同,不同则插入历史表中
22 if (str1 != str2)
23 {
24 history.BeforeValue = str1; //修改前的值
25 history.AfterValue = str2; //修改后的值
26 history.PCardNo = id; //修改数据的ID
27 history.IPAddress = HanNeng.Common.GetClientIP.GetRealIP(); //获取当前用户的IP地址
28 atrr = property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false)[0] as Model.Atrributes.ModifyFields;
29 history.ModifyField = property.Name; //修改的字段名称
30 history.ModifyFieldName = atrr.FieldsName; //修改的字段中文名称
31
32 new BLL.PerFileHistory().AddModel(history);
33 }
34 }
35 //}
36 }
37 }
38 }
复制代码
2.获取字段中文名,这个是在Model的类名里设置,示例如下:
复制代码
1 /// <summary>
2 /// 获取字段名称
3 /// </summary>
4 public class ModifyFields : Attribute
5 {
6 public ModifyFields()
7 {
8 }
9 public ModifyFields(string name)
10 {
11 this.FieldsName = name;
12 }
13 /// <summary>
14 /// 修改的字段中文名
15 /// </summary>
16 public string FieldsName
17 {
18 get;
19 set;
20 }
21 }
复制代码
复制代码
1 /// <summary>
2 /// 科部
3 /// </summary>
4 [Atrributes.ModifyFields("科部")]
5 public int? SubjectDep
6 {
7 set { _subjectdep = value; }
8 get { return _subjectdep; }
9 }
复制代码
3.调用方式示例:
复制代码
1 if (id != null)
2 {
3 Model.PersonFile Person = bllPerson.GetModel<Model.PersonFile>(id);
4 if (modelPerson != null)
5 {
6 Model.Identity identity = Session["Identity"] as Model.Identity;
7 //if (identity.RoleIDs.ToString() == "R01") //如果是系统管理员,则不记录历史
8 //{
9 //对前后数据的不同进行比较
10 Model.PersonFile OldPerson = Person;
11 Model.PersonFile NewPerson = modelPerson;
12 NewPerson.PersonAutoID = OldPerson.PersonAutoID;
13 IsUpdate(OldPerson, NewPerson, id);
14 //}
15 }
16 }