zoukankan      html  css  js  c++  java
  • .NET MVC通过反射获取数据修

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

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

      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() > 0)
    {
    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)[0] as Model.Atrributes.ModifyFields;
    history.ModifyField = property.Name; //修改的字段名称
    history.ModifyFieldName = atrr.FieldsName; //修改的字段中文名称

    new BLL.PerFileHistory().AddModel(history);
    }
    }
    //}
    }
    }
    }

    复制代码
     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的类名里设置,示例如下:

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

    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     }
    复制代码

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

    Model类名示例

    复制代码
    1          /// <summary>
    2         /// 科部
    3         /// </summary>
    4         [Atrributes.ModifyFields("科部")]
    5         public int? SubjectDep
    6         {
    7             set { _subjectdep = value; }
    8             get { return _subjectdep; }
    9         }
    复制代码

      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

    复制代码
     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                 }
    复制代码

      4.最终的效果图:

     
     

    JQuery结合Ajax实现双击Table表格,使Table变成可编辑,并保存到数据库中

     

          近期在做项目时,要实现通过双击Table表格的TR,使Table行变成可编辑,来实现修改数据并保存到数据库中的功能,无需多说,直接贴代码吧。希望能得到各位同仁指正。       

    function tdEdit(element, id) {
    var i_a = "<input class='edit_td' type='text' style='height:30px; 40px;' value='";
    var i_b = "'/>";
    var t_a = "<textarea class='tarea' cols='63' rows='3' style='90%'>";
    var t_b = "</textarea>";
    var td = $(element).find("td");
    if (td.length > 0) {
    var sc = $(element).children().eq(1).text();
    var ss = $(element).children().eq(2).text();
    var sequence = $(element).children().eq(3).text();
    var weight = $(element).children().eq(4).text();
    var max = $(element).children().eq(5).text();
    var min = $(element).children().eq(6).text();
    var cv = $(element).children().eq(7).text();
    var explain = $(element).children().eq(8).text();

    $(element).children().eq(1).html($(t_a + sc + t_b));
    $(element).children().eq(2).html($(t_a + ss + t_b));
    $(element).children().eq(3).html($(i_a + sequence + "'id='num1" + i_b));
    $(element).children().eq(4).html($(i_a + weight + "'id='num2" + i_b));
    $(element).children().eq(5).html($(i_a + max + "'id='maxvalue" + i_b));
    $(element).children().eq(6).html($(i_a + min + "'id='minvalue" + i_b));
    $(element).children().eq(7).html($(t_a + cv + t_b));
    $(element).children().eq(8).html($(t_a + explain + t_b));
    }
    $(".edit_td").click(function () {
    return false;
    });
    $(".tarea").click(function () {
    return false;
    });
    //获取焦点
    $(".edit_td").trigger("focus");
    $(".tarea").trigger("focus");

    //文本框失去焦点后提交内容,重新变为文本
    $(".save").click(function () {
    //验证信息"n":/^d+$/
    var reg = /^[0-9]+.{0,1}[0-9]{0,2}$/;
    var num1 = $("#num1").val();
    var num2 = $("#num2").val();
    var max = $("#maxvalue").val();
    var min = $("#minvalue").val();
    if (parseInt(min) > parseInt(max)) {
    alert("最小值不能大于最大值!");
    return false;
    }
    if (!reg.test(num1) || !reg.test(num2) || !reg.test(max) || !reg.test(min)) {
    alert("请输入数字!");
    return false;
    }
    //重新赋上新值
    $(".edit_td").each(function (i) {
    var newtxt = $(this).val();
    $(element).children().eq(i + 3).html(newtxt);
    });
    $(".tarea").each(function (j) {
    var newtarea = $(this).val();
    if (j < 2) {
    $(element).children().eq(j + 1).html(newtarea);
    }
    else {
    $(element).children().eq(j + 5).html(newtarea);
    }
    });

    var new_sc = $(element).children().eq(1).text();
    var new_ss = $(element).children().eq(2).text();
    var new_sequence = $(element).children().eq(3).text();
    var new_weight = $(element).children().eq(4).text();
    var new_max = $(element).children().eq(5).text();
    var new_min = $(element).children().eq(6).text();
    var new_cv = $(element).children().eq(7).text();
    var new_explain = $(element).children().eq(8).text();
    if (new_sc != sc || new_ss != ss || new_sequence != sequence || new_weight != weight || new_max != max || new_min != min || new_cv != cv || new_explain != explain) {
    $.ajax({
    type: 'POST',
    contentType: 'application/json',
    url: '/Ajax/AjaxAction.ashx/UpdateRuleDetail',
    data: '{id:"' + id + '",strCon:"' + new_sc + '",strStandard:"' + new_ss + '",Sequence:"' + new_sequence + '",Weight:"' + new_weight + '",CandidateValue:"'
    + new_cv + '",MaxValue:"' + new_max + '",MinValue:"' + new_min + '",Explain:"' + new_explain + '"}',
    dataType: 'json',
    async: true,
    beforeSend: function () {
    },
    success: function (data) {
    alert("保存成功!");
    window.location.reload(); //刷新页面
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
    alert(XMLHttpRequest + ':' + textStatus);
    window.location.reload();
    }
    });
    }
    else {
    alert("温馨提示:您没有做任何修改!");
    window.location.reload();
    }

    });
    }

    JS

    复制代码
      1 function tdEdit(element, id) {
      2     var i_a = "<input class='edit_td' type='text' style='height:30px; 40px;' value='";
      3     var i_b = "'/>";
      4     var t_a = "<textarea class='tarea' cols='63' rows='3' style='90%'>";
      5     var t_b = "</textarea>";
      6     var td = $(element).find("td");
      7     if (td.length > 0) {
      8         var sc = $(element).children().eq(1).text();
      9         var ss = $(element).children().eq(2).text();
     10         var sequence = $(element).children().eq(3).text();
     11         var weight = $(element).children().eq(4).text();
     12         var max = $(element).children().eq(5).text();
     13         var min = $(element).children().eq(6).text();
     14         var cv = $(element).children().eq(7).text();
     15         var explain = $(element).children().eq(8).text();
     16 
     17         $(element).children().eq(1).html($(t_a + sc + t_b));
     18         $(element).children().eq(2).html($(t_a + ss + t_b));
     19         $(element).children().eq(3).html($(i_a + sequence + "'id='num1" + i_b));
     20         $(element).children().eq(4).html($(i_a + weight + "'id='num2" + i_b));
     21         $(element).children().eq(5).html($(i_a + max + "'id='maxvalue" + i_b));
     22         $(element).children().eq(6).html($(i_a + min + "'id='minvalue" + i_b));
     23         $(element).children().eq(7).html($(t_a + cv + t_b));
     24         $(element).children().eq(8).html($(t_a + explain + t_b));
     25     }
     26     $(".edit_td").click(function () {
     27         return false;
     28     });
     29     $(".tarea").click(function () {
     30         return false;
     31     });
     32     //获取焦点
     33     $(".edit_td").trigger("focus");
     34     $(".tarea").trigger("focus");
     35 
     36     //文本框失去焦点后提交内容,重新变为文本
     37     $(".save").click(function () {
     38         //验证信息"n":/^d+$/
     39         var reg = /^[0-9]+.{0,1}[0-9]{0,2}$/;
     40         var num1 = $("#num1").val();
     41         var num2 = $("#num2").val();
     42         var max = $("#maxvalue").val();
     43         var min = $("#minvalue").val();
     44         if (parseInt(min) > parseInt(max)) {
     45             alert("最小值不能大于最大值!");            
     46             return false;
     47         }
     48         if (!reg.test(num1) || !reg.test(num2) || !reg.test(max) || !reg.test(min)) {
     49             alert("请输入数字!");            
     50             return false;
     51         }
     52         //重新赋上新值
     53         $(".edit_td").each(function (i) {
     54             var newtxt = $(this).val();
     55             $(element).children().eq(i + 3).html(newtxt);
     56         });
     57         $(".tarea").each(function (j) {
     58             var newtarea = $(this).val();
     59             if (j < 2) {
     60                 $(element).children().eq(j + 1).html(newtarea);
     61             }
     62             else {
     63                 $(element).children().eq(j + 5).html(newtarea);
     64             }
     65         });
     66 
     67         var new_sc = $(element).children().eq(1).text();
     68         var new_ss = $(element).children().eq(2).text();
     69         var new_sequence = $(element).children().eq(3).text();
     70         var new_weight = $(element).children().eq(4).text();
     71         var new_max = $(element).children().eq(5).text();
     72         var new_min = $(element).children().eq(6).text();
     73         var new_cv = $(element).children().eq(7).text();
     74         var new_explain = $(element).children().eq(8).text();
     75         if (new_sc != sc || new_ss != ss || new_sequence != sequence || new_weight != weight || new_max != max || new_min != min || new_cv != cv || new_explain != explain) {
     76             $.ajax({
     77                 type: 'POST',
     78                 contentType: 'application/json',
     79                 url: '/Ajax/AjaxAction.ashx/UpdateRuleDetail',
     80                 data: '{id:"' + id + '",strCon:"' + new_sc + '",strStandard:"' + new_ss + '",Sequence:"' + new_sequence + '",Weight:"' + new_weight + '",CandidateValue:"'
     81                     + new_cv + '",MaxValue:"' + new_max + '",MinValue:"' + new_min + '",Explain:"' + new_explain + '"}',
     82                 dataType: 'json',
     83                 async: true,
     84                 beforeSend: function () {
     85                 },
     86                 success: function (data) {                   
     87                     alert("保存成功!");
     88                     window.location.reload();   //刷新页面               
     89                 },
     90                 error: function (XMLHttpRequest, textStatus, errorThrown) {
     91                     alert(XMLHttpRequest + ':' + textStatus);
     92                     window.location.reload();
     93                 }
     94             });
     95         }
     96         else {
     97             alert("温馨提示:您没有做任何修改!");
     98             window.location.reload();
     99         }
    100         
    101     });
    102 }
    复制代码

      前台页面绑定: 

     <tr ondblclick="tdEdit(this,@item.ID)"></tr>
    1 <tr ondblclick="tdEdit(this,@item.ID)"></tr>

         最终效果图:

     
     
    分类: C#知识
    分类: C#知识
  • 相关阅读:
    MFC菜单、工具栏和状态栏
    MFC控件
    MFC对话框
    MFC消息映射机制
    性能优化可使用的工具
    常见的内存问题分析思路
    k8s之Probe
    docker swarm
    keepalived配置虚拟ip(vip)实现双机热备以及自动切换主备
    linux安装openjdk1.8
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3852314.html
Copyright © 2011-2022 走看看