ASP.NET中实现Form表单字段值自动填充到操作模型中
我们知道asp.net mvc有个强大的地方就是form表单提交到action的时候,可以直接将form的参数直接装配到action的参数实体对象中
比如
action方法 register(usermodel usermodel)
{
.............................
}
在提交表单的时候,会自动讲表单里面的字段封装到对应的usermodel字段里面
那么 webform里面可不可以也紫将呢?
因为每次都要去获得数据,优秀的程序员应该要学会代码封装,代码复用,重复的工作不要做
我们其实可以利用反射来实例化对象的(自动装配)
好了废话不多....
pageload里面很简单了
protected void page_load(object sender, eventargs e)
{
if (!ispost())
{
initpage();//第一次访问呈现页面
}
else
{
usermodel usermodel = assemblemodel<usermodel>(base.valuecollection);
}
}
关键就是基类里面的assemblemodel 方法了
基类里面
我们首先获取到上下文的参数 it404
protected namevaluecollection valuecollection = httpcontext.current.request.params;
基类很简单,就是将上下文的提交的参数存放到valuecollection
然后再看assemblemodel方法了,这是一个泛型方法
/// <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来匹配和赋值
所以以后我们只需要一句代码 就能自动装配上从客户端存过来的值了
usermodel usermodel = assemblemodel<usermodel>(base.valuecollection);
上一篇: 我的主页 博客分类: 感想 .net