zoukankan      html  css  js  c++  java
  • ASP.NET MVC中的模型装配 封装方法 非常好用

    下面说一下

    我们知道在asp.net mvc中 视图可以绑定一个实体模型

    然后我们三层架构中也有一个model模型

    但是这两个很多时候却是不一样的对象来的

    就拿微软的官方mvc例子来说明

        微软的视图实体中 有loginmodel 有registermodel 等等 这些视图模型 都只是占用户实体的某几个字段而已,甚至有一些视图模型 的字段是来自多个表的,那么很多人可能用最原始的赋值方法,比如用户注册后 拿到post过来后的实体,这个时候再重新new一个三层的model实体,然后在一个个的字段赋值过来,

     比如:

       [httppost]

       public ActionResult Register(LoginModel model)

      {

             UserModel userModel = new UserModel();

            userModel.Name = model.Name;

            userModel.Email = model.Email;

            userModel.Password = model.Password;

            ......................................

            UserDao.Add(userModel);

       }

    这样非常累赘,简直就是体力活。

       下面我总结了两个方法,这两个方法可以自动地根据实体的属性名称自动的赋值过来,第一个是将某个实体的属性值之间赋值到一个新的实体中,如果新的实体中含有自己的属性,那么就用初始值,第二个是将一个A的实体赋值到B中

    那么这个时候 我们可以用下面两个方法来转换 自动赋值两个对象的

    protected T AssembleInfo<T, T2>(T2 model)
            {
                PropertyInfo[] propertyInfoList = GetPropertyInfoArray(typeof(T));
                PropertyInfo[] propertyInfoList2 = GetPropertyInfoArray(typeof(T2));
                object obj = Activator.CreateInstance(typeof(T), null);//创建指定类型实例
                for (int i = 0; i < propertyInfoList.Length; i++)
                {
                    for (int J = 0; J < propertyInfoList2.Length; J++)
                    {
                        if (propertyInfoList2[J].Name.ToLower() == propertyInfoList[i].Name.ToLower())
                        {
                            propertyInfoList[i].SetValue(obj, propertyInfoList2[J].GetValue(model,null), null);//给对象赋值
                        }
                    }
                }
                return (T)obj;
            }


            /// <summary>
            /// 反射获取类的属性
            /// </summary>
            /// <param name="type"></param>
            /// <returns></returns>
            protected PropertyInfo[] GetPropertyInfoArray(Type type)
            {
                PropertyInfo[] props = null;
                try
                {
                    object obj = Activator.CreateInstance(type);
                    props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
                }
                catch (Exception ex)
                {

                }
                return props;
            }

    ---------------------使用的时候 只需要

    ModelInfo info = AssembleInfo<ModelInfo, ModelModel>(model);

    就可以自动根据属性名称自动将modelmodel这个实体的值自动赋值到modelinfo

    感谢你的阅读,希望对你有帮助 谢谢

  • 相关阅读:
    [转载] IE8+兼容小结
    vue添加,删除内容
    vue跳转的两种方法
    checked 完整版全选,单选,反选
    网页特殊符号HTML代码大全
    利用css 实现 视觉差效果
    css 自定义滚动条样式
    js 模拟键盘
    css 动画 transition和animation
    浅谈浏览器垃圾回收机制
  • 原文地址:https://www.cnblogs.com/maijin/p/4768684.html
Copyright © 2011-2022 走看看