本文属于原创,转载时请标明出处!

折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射、折射怎么解。感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了。纪念一下。

  1.核心代码:

 private static void IsUpdate<T>(T old, T current, string id)
{
Model.PerFileHistory history = new Model.PerFileHistory();
Model.Atrributes.ModifyFields atrr = null;
Type type = typeof(T);
PropertyInfo[] propertys = type.GetProperties();
foreach (PropertyInfo property in propertys)
{
if (property.PropertyType.IsValueType || property.PropertyType.Name == "String")
{
if (property.PropertyType.FullName.Contains("Guid"))
continue;
//if (property.Name != "CreateUserID" && property.Name != "CreateTime" && property.Name != "ModifyUserID" && property.Name != "LastModifyTime")//排除这些字段不做判断
//{
if (property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false).Count() > )
{
object o1 = property.GetValue(old, null); //以前的值
object o2 = property.GetValue(current, null); //修改后的值
string str1 = o1 == null ? string.Empty : o1.ToString();
string str2 = o2 == null ? string.Empty : o2.ToString();
//判断两者是否相同,不同则插入历史表中
if (str1 != str2)
{
history.BeforeValue = str1; //修改前的值
history.AfterValue = str2; //修改后的值
history.PCardNo = id; //修改数据的ID
history.IPAddress = HanNeng.Common.GetClientIP.GetRealIP(); //获取当前用户的IP地址
atrr = property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false)[] as Model.Atrributes.ModifyFields;
history.ModifyField = property.Name; //修改的字段名称
history.ModifyFieldName = atrr.FieldsName; //修改的字段中文名称 new BLL.PerFileHistory().AddModel(history);
}
}
//}
}
}
}

  2.获取字段中文名,这个是在Model的类名里设置,示例如下:

 /// <summary>
/// 获取字段名称
/// </summary>
public class ModifyFields : Attribute
{
public ModifyFields()
{
}
public ModifyFields(string name)
{
this.FieldsName = name;
}
/// <summary>
/// 修改的字段中文名
/// </summary>
public string FieldsName
{
get;
set;
}
}

Model

          /// <summary>
/// 科部
/// </summary>
[Atrributes.ModifyFields("科部")]
public int? SubjectDep
{
set { _subjectdep = value; }
get { return _subjectdep; }
}

Model类名示例

  3.调用方式示例:

          if (id != null)
{
Model.PersonFile Person = bllPerson.GetModel<Model.PersonFile>(id);
if (modelPerson != null)
{
Model.Identity identity = Session["Identity"] as Model.Identity;
//if (identity.RoleIDs.ToString() == "R01") //如果是系统管理员,则不记录历史
//{
//对前后数据的不同进行比较
Model.PersonFile OldPerson = Person;
Model.PersonFile NewPerson = modelPerson;
NewPerson.PersonAutoID = OldPerson.PersonAutoID;
IsUpdate(OldPerson, NewPerson, id);
//}
}
}

Controller.CS

  4.最终的效果图:

.NET MVC通过反射获取数据修改历史记录,并插入数据表中的更多相关文章

  1. .NET MVC通过反射获取数据修

    .NET MVC通过反射获取数据修 折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射.折射怎么解.感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了.纪念一下. 1. ...

  2. 使用SQLServer2005插入一条数据时返回当前插入数据的ID

    使用SQLServer2005插入一条数据时返回当前插入数据的ID 在执行完插入后 再执行 select @@identity from users 就OK 就是刚才插入的那行的 ID了 补充: @@ ...

  3. 通过mapreduce把mysql的一张表的数据导到另外一张表中

    怎么安装hadoop集群我在这里就不多说了,我这里安装的是三节点的集群 先在主节点安装mysql 启动mysql 登录mysql 创建数据库,创建表格,先把数据加载到表格 t ,表格t2是空的 mys ...

  4. 45. 腾讯面试题: 使用hashmap 插入数据,怎么样依照插入数据的顺序输出数据

    题目:使用hashmap 插入数据,怎么样依照插入数据的顺序输出数据 分析: 使用hashmap插入数据,数据的顺序会改变.能够写个小程序试试. 那怎么样依照插入的顺序输出呢? 方法一: 这是我第一时 ...

  5. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  6. vue 父组件数据修改,子组件数据未修改

    页面: 父组件  <myfeedback></myfeedback>  子组件  <news></news> myfeedback.vue <te ...

  7. 修改MySQL数据库中表和表中字段的编码方式的方法

    今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1 ...

  8. MySQL 插入数据 通过命令提示窗口插入数据

    MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插 ...

  9. hive sql 查询一张表的数据不在另一张表中

    有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...

随机推荐

  1. 初始化JQuery方法与(function(){})(para)匿名方法介绍

    一.初始化JQuery对象 DOM加载完成时运行代码 1.$(document).ready(function(){ 全写 // 在这里写你的代码... }); 2.jQuery(function() ...

  2. javascript 正则匹配手机号码

      <form class="form-horizontal" name="mobileform" style="padding:10px;&q ...

  3. 禁止ios默认拉动弹性行为

    document.ontouchmove = function(e) { e.preventDefault();} /** 禁止ios默认拉动弹性行为**///屏蔽ios下浏览器滚动缓冲效果

  4. 学c语言做练习

    /*编写一个函数,其功能是使输入字符串反序.在一个使用循环语句为这个函数提供输入的完整 程序中进行测试.*/ #include<stdio.h> #include<string.h& ...

  5. c语言实现BMP图像转换为灰度图

    当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了 ...

  6. LIBSVM之一

    libSVM简单的介绍 libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归.由于libSVM程序小,运用灵活 ...

  7. MetaData元数据

    一.基础 定义:数据库.表.列相关信息的描述.    何时使用:想取得对数据库的信息时使用.    一]数据库元数据——通过DataBaseMetaData            DataBaseMe ...

  8. ural 1874 Football Goal

    #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> u ...

  9. 对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)

    Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...

  10. Basic Printing Architecture

    https://blogs.technet.microsoft.com/askperf/2007/06/19/basic-printing-architecture/ Printer sharing, ...