源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

ASP.NET中实现Form表单字段值自动填充到操作模型中

  • 时间:2020-02-14 08:40 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:ASP.NET中实现Form表单字段值自动填充到操作模型中
我们知道ASP.NET MVC有个强大的地方就是Form表单提交到action的时候,可以直接将Form的参数直接装配到action的参数实体对象中 比如
[u]复制代码[/u] 代码如下:
action方法 Register(UserModel userModel) {    .............................  }
在提交表单的时候,会自动讲表单里面的字段封装到对应的UserModel字段里面 那么 WebForm里面可不可以也紫将呢? 因为每次都要去获得数据,优秀的程序员应该要学会代码封装,代码复用,重复的工作不要做 我们其实可以利用反射来实例化对象的(自动装配) 好了废话不多.... pageload里面很简单了
[u]复制代码[/u] 代码如下:
protected void Page_Load(object sender, EventArgs e)         {             if (!IsPost())             {                 InitPage();//第一次访问呈现页面             }             else             {                 UserModel userModel = AssembleModel<UserModel>(base.valueCollection);             }         }
关键就是基类里面的AssembleModel 方法了 基类里面 我们首先获取到上下文的参数 IT404
[u]复制代码[/u] 代码如下:
protected NameValueCollection valueCollection = HttpContext.Current.Request.Params;
基类很简单,就是将上下文的提交的参数存放到valueCollection 然后再看AssembleModel方法了,这是一个泛型方法
[u]复制代码[/u] 代码如下:
/// <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;         }         /// <summary>         /// 根据NameValueCollection 自动装配         /// </summary>         /// <typeparam name="T"></typeparam>         /// <param name="valueCollection"></param>         /// <returns></returns>         protected T AssembleModel<T>(NameValueCollection valueCollection)         {             PropertyInfo[] propertyInfoList = GetPropertyInfoArray(typeof(T));             object obj = Activator.CreateInstance(typeof(T), null);//创建指定类型实例             foreach (string key in valueCollection.Keys)//所有上下文的值             {                 foreach (var PropertyInfo in propertyInfoList)//所有实体属性                 {                     if (key.ToLower() == PropertyInfo.Name.ToLower())                     {                         PropertyInfo.SetValue(obj, valueCollection[key], null);//给对象赋值                     }                 }             }             return (T)obj;         }
很简单,就是遍历参数,然后用反射遍历出实体类的共有属性,然后根据名字name来匹配和赋值 所以以后我们只需要一句代码 就能自动装配上从客户端存过来的值了
[u]复制代码[/u] 代码如下:
UserModel userModel = AssembleModel<UserModel>(base.valueCollection);
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部