WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件
所以在提交信息的时候需要自己手动的去Request.QueryString[]或者Request.Form[]去获取,转型,判定等等
觉得这样子的代码写多了不甚其烦,就在想能不能自动获取,解析这些参数成我需要的数据实体呢,当然是可以的
这里我用反射根据参数的Key与实体的PropertyName进行对比,类型转换赋值给实体
public static T NameValues2Entity<T>(NameValueCollection NVS)
{
if (!NVS.HasKeys()) return default(T);
T entity = Activator.CreateInstance<T>();
PropertyInfo[] attrs = entity.GetType().GetProperties();
foreach (PropertyInfo p in attrs)
{
foreach (string key in NVS.AllKeys)
{
if (string.Compare(p.Name, key, true) == 0)
{
p.SetValue(entity, Convert.ChangeType(NVS[key], p.PropertyType), null);
}
}
}
return entity;
}
获取的时候直接调用NameValues2Entity<Model.Article>(Request.Form)即可获取Model.Article的数据实体,当然反射里面我没有做数据类型转化失败的判定,也只是简单的数据类型验证,如果需要复杂的数据类型验证,这里自己递归一下。
同时这里可以自行扩展,做个数据验证,神马必填,范围,正则等等,通过AOP来实现(通过对实体字段定义自定义属性达到数据验证)!
传递数据的搞定了,现在我们来做做读取数据的
如果你还是用的ADO.NET读取数据的时候全部是DataSet,DataTable
你需要得到其实体(ViewModel)或者需要对其实体进行序列化,(默认情况下DataTable无法进行Json序列化)
可以自己根据DataTable的数据类型定义一个实体,但是自己手动转换还得判定DbNull的情况
这里我们也通过反射实现一个
public static List<T> DataTable2Entities<T>(DataTable table)
{
if (null == table || table.Rows.Count <= 0) return default(List<T>);
List<T> list = new List<T>();
List<string> keys = new List<string>();
foreach (DataColumn c in table.Columns)
{
keys.Add(c.ColumnName.ToLower());
}
for (int i = 0; i < table.Rows.Count; i++)
{
T entity = Activator.CreateInstance<T>();
PropertyInfo[] attrs = entity.GetType().GetProperties();
foreach (PropertyInfo p in attrs)
{
if (keys.Contains(p.Name.ToLower()))
{
if (!DBNull.Value.Equals(table.Rows[i][p.Name]))
{
p.SetValue(entity, Convert.ChangeType(table.Rows[i][p.Name], p.PropertyType), null);
}
}
}
list.Add(entity);
}
return list;
}
这个里面已经自动对DBNull的情况做了判定
调用时候直接var model=DataTable2Entities<Model.Article>(dt);即可
WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体的更多相关文章
- Objective-C中ORM的运用:实体对象和字典的相互自动转换
http://blog.csdn.net/cooldragon/article/details/18991973 iOS开发中基于ORM的框架很多,如SQLitePersistentObject,实际 ...
- NodeJs获取不到POST参数
NodeJs报错,从网页端获取不到POST参数,提示错误类似如下 TypeError: Cannot read property 'username' of undefined at C:\U ...
- 如何获取url中的参数并传递给iframe中的报表
在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...
- 使用JS,获取URL中指定参数的值
/** * 获取URL中指定参数的值 * * @param name 参数名称 * @returns */ function getQueryString(name) { var reg = new ...
- APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法
用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...
- javaScript获取url中的参数
var urlTools = { //获取RUL参数值 getUrlParam: function(name) { /*?videoId=identification */ var params = ...
- js通过location.search来获取页面传来的参数
这篇文章主要介绍了通过window.location.search来获取页面传来的参数,经测试是OK的 ? 1 2 3 4 5 function GetQueryString(name) { var ...
- CI框架获取post和get参数 CodeIgniter
请参考:CI文档的输入类部分: $this->input->post() $this->input->get() ------------------------------- ...
- vue中如何不通过路由直接获取url中的参数
前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...
随机推荐
- Sublime Text3配置在可交互环境下运行python快捷键
安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- HTML骨架结构
前面的话 一个完整的HTML文档必须包含3个部分:文档声明.文档头部和文档主体.而正是它们构成了HTML的骨架结构.前面已经分别介绍过文档声明和文档头部,本文将详细介绍构成HTML骨架结构的基础元 ...
- .net Elasticsearch 学习入门笔记
一. es安装相关1.elasticsearch安装 运行http://localhost:9200/2.head插件3.bigdesk插件安装(安装细节百度:windows elasticsear ...
- continue break 区别
在循环中有两种循环方式 continue , break continue 只是跳出本次循环, 不在继续往下走, 还是开始下一次循环 break 将会跳出整个循环, 此循环将会被终止 count = ...
- iOS开源项目周报1215
由OpenDigg 出品的iOS开源项目周报第一期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. PY ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 用Taurus.MVC 做个企业站(上)
前言: 之前是打算写一篇文章叫:Taurus.MVC 从入门到精通,一篇完事篇! 后来转指一念,还是把教程集在这个企业站项目上吧!!! 企业站风格: 之前发过一个帮师妹写的企业站:最近花了几个夜晚帮师 ...
- 如何安装并简单的使用OwinHost——Katana
微软OWIN的提出必然会引起一场风暴,而我们作为C#阵营中一份子,自然免不了会卷入其中.OWIN是什么东西,我在这里就不解析了,还不知道是OWIN是什么的读者请打开浏览器,然后搜索即可,中文的英文的应 ...
- Linux1 在Linux(CentOS)上安装MySql详细记录
前记: 毕业两年了,前两天换了份工作,由以前的传统行业跳到了互联网行业.之前的公司一直在用WinServer2003+Tomcat+SqlServer/Oracle这套部署环境.对于Linux+To ...