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

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

  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. GetWindowText

    用于得到窗口中的数据 {// TODO: If this is a RICHEDIT control, the control will not// send this notification un ...

  2. CSS中zoom:1的作用

    兼容IE6.IE7.IE8浏览器,经常会遇到一些问题,可以使用zoom:1来解决,有如下作用:触发IE浏览器的haslayout解决ie下的浮动,margin重叠等一些问题.比如,本站使用DIV做一行 ...

  3. javascript 滚动条下拉导航fixed

    <!doctype html> <html> <style> body{ margin:; padding:; } #top{ background:#; widt ...

  4. UCOS 堆栈大小 计算 (堆栈的决定性因素)

    决定栈空间的大小,不仅需要计算任务本身的需求(局部变量.函数调用等),还要计算最多中断嵌套层数(保存寄存器.中断服务程序中局部变量等) 原文地址:uCOS任务堆栈的深入分析.作者:jiecou 堆栈作 ...

  5. poj 3335 Rotating Scoreboard

    http://poj.org/problem?id=3335 #include <cstdio> #include <cstring> #include <algorit ...

  6. U8800安装软件显示无效的URI问题

    看到很多人遇到这个问题,其中包括我自己,最后找到可行的解决办法,现整理出来一个新帖,有同样问题的U友可以参考下. 手机先连接电脑,进入USB存储状态,然后在计算机上找到SD卡目录下的.android_ ...

  7. DELPHI7如何调用带参数的JAVA WebService

    对方提供的WebService地址是http://192.168.1.6:8080/test/pic?XH=XX用DELPHI如何调呢 ------解决方案--------------------通过 ...

  8. Android写入文件操作权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses- ...

  9. HDU_2553——n皇后问题,作弊

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放置方法.   Inp ...

  10. NOI2014题解

    起床困难综合症(BZOJ 3668) 送分题,直接从高位向低位贪心. 魔法森林(BZOJ 3669) 一个容易想到的办法就是枚举A的最大值,以B作为权值求最小生成树.暴力的话要T的.如果从小到大枚举A ...