ASP.NET MVC中的模型装配 封装方法 非常好用

时间:2021-06-24 12:57:08
下面说一下

我们知道在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

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