ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?
我们知道ASP.NET MVC有个强大的地方就是Form表单提交到action的时候,可以直接将Form的参数直接装配到action的参数实体对象中
比如
action方法 Register(UserModel userModel)
{
.............................
}
在提交表单的时候,会自动讲表单里面的字段封装到对应的UserModel字段里面
那么 WebForm里面可不可以也紫将呢?
因为每次都要去获得数据,优秀的程序员应该要学会代码封装,代码复用,重复的工作不要做
我们其实可以利用反射来实例化对象的(自动装配)北盟网www.bamn.cn
好了废话不多....
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); 好了,感谢你的阅读,希望对你有帮助了,
另外 本博客将会有一些原创的视频教程分享给大家,感谢大家的支持
ASP.NET WebForm Form表单如何实现MVC那种“自动装配”效果呢?的更多相关文章
- Asp 循环输出 form 表单提交的数据
亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...
- Jquery来对form表单提交(mvc方案)
来自:http://www.cnblogs.com/lmfeng/archive/2011/06/18/2084325.html 我先说明一下,这是asp.net mvc 里面的用法, Jquery来 ...
- form表单 一个input时 回车自动提交
问题描述 form表单中,如果当前表单只有一个input输入框时,单击回车会自动提交当前表单. 解决方案 在当前form表单中添加一个隐藏的input, <input style="d ...
- form表单取消按钮自动提交
默认写在form表单里的按钮可以自动提交表单,现在要实现的效果是点击button按钮调用js函数,再有ajax提交 <button type="button" class=& ...
- 项目回顾1-图片上传-form表单还是base64-前端图片压缩
第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下. 首先想到的是图片上传的问题.在通常表单数据都是ajax上 ...
- 微信小程序_(组件)form表单
Form表单.switch开关.数值选择器效果 官方文档:传送门 点击提交表单(按钮,提交开关,数值选择器,输入文本中)的值,显示在控制台上,点击重置,重置表单中的值. 实现过程 form表单,添加f ...
- 不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。
很多时候,我们使用服务器端控件写出的代码,会给我们生成一些很多我们看不懂的代码(初学者),但是有时候我们并不需要这些代码(业务需求不同),对于生成的一些代码感到多余.所以我就开始想,有没有一种可能:不 ...
- asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)
原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...
- Asp.Net Form表单控件的回车默认事件
当form表单文本框控件在收到回车事件时,默认会触发表单内第一个可提交按钮的事件,但业务中可能要求有其它控件进行提交,而不是这个默认的 这时需要脚本控件事件冒泡传递取消回事事件. $(document ...
随机推荐
- [leetcode]Recover Binary Search Tree @ Python
原题地址:https://oj.leetcode.com/problems/recover-binary-search-tree/ 题意: Two elements of a binary searc ...
- iOS开发-Certificates、Identifiers和Profiles详解
如果是才进入公司进行开发的iOS程序猿来说人难免会对苹果的证书.配置文件,尤其有的需要重头开始的公司来说,最简单的来说真机调试是免不了和这些东西打交道的,有的时候赶时间做完了可能心里也犯嘀咕,本文根据 ...
- ORM数据库框架 SQLite 常用数据库框架比较 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 关于使用rem单位、css函数calc()进行自适应布局
一.关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单 ...
- Android之ASD组件(一)
Google在android5.0之后推出新设计标准Material Design,为了能在低版本上使用Material Design,google发布了Android Support Design支 ...
- 双数组Trie的一种实现
An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...
- linux命令学习——file
1.简介 file命令是用来检测并显示文件类型(determine file type).通过file指令,我们得以辨识该文件的类型,例如可以知道动态连接库是32位还是64位. 2.命令格式 file ...
- background-size中contain和cover中的数学公式
background-size的contain和cover是怎么用的,大家应该都明白.但是里面也有一些有趣的数学关系. 基本概念 上面就是我们对于 rimage (图片宽高比).rviewport ( ...
- Provide your license server administrator with the following information.error code =-42,147
ArcEngine应用程序开发中,许可不必不可少的.一般采取两种方式来获取许可——License控件和AoInitialize类,但今天在VS2010打开程序时,隔一会弹出错误窗口:Provide y ...
- Max SPA
Stingray Response_ContentType Stingray javascript 其实是支持返回原生html的, 有了这个事情就简单了 RHTML - Response_Conten ...