asp.net中Request请求参数的自动封装
这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例:
方便测试用所以这里是一个很简单的表单.
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form action="RequestHandler.ashx"> <table> <tr> <td>用户名:</td> <td><input type="text" name="Username" /></td> </tr> <tr> <td>密码:</td> <td><input type="text" name="UserPwd" /></td> </tr> <tr><td colspan="2"><input type="submit" value="提交"/></td></tr> </table> </form> </body> </html>
有一个和表单对应的实体类:
using System; using System.Collections.Generic; using System.Linq; using System.Web; public class EUser { public string Username { get; set; } public string UserPwd { get; set; } }
在RequestHandler中我们这样做:
<%@ WebHandler Language="C#" Class="RequestHandler" %> using System; using System.Web; public class RequestHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { EUser user = new EUser {//下面的操作相信不少像我一样的同学已经做的要吐了.. Username = context.Request["Username"], UserPwd = context.Request["UserPwd"] }; //之后对User进行业务处理.... } public bool IsReusable { get { return false; } } }
因为这里测试用所以只有两个字段,假如这里有10个20个字段,是不是有懵逼的感觉,时间长了有木有感觉这样写代码真的很low.一不小心键名复制错了还会出错.自从大二开始学asp一直到现在这操作也不知道多少回了...
对于用惯了Struts2和asp.net mvc自动封装功能的同学来说还写这个,是不是有一种开了飞机回来一趟却要踩滑板车一步一步蹬的感觉..
前两天做一个java小项目的时候用到了一个很好用的工具beanutils,它可以帮我们很轻易的封装请求参数,受到它的启发我写了一个小工具类,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Reflection; using System.Collections.Specialized; namespace zze { public class NotANumber : Exception { public NotANumber(string message) : base(message) { } } public class DateFormatError : Exception { public DateFormatError(string message) : base(message) { } } public class BeanUtil { public static T FillBean<T>(HttpRequest request) { PropertyInfo[] Properties = typeof(T).GetProperties(); T bean = Activator.CreateInstance<T>(); NameValueCollection nameVals = request.Form; ; i < nameVals.Count; i++) { string keyStr = nameVals.GetKey(i); StringBuilder valStr = new StringBuilder(); string[] vals = nameVals.GetValues(i); ) { ; j < vals.Length; j++) { ) { valStr.Append(vals[j] + ","); } else { valStr.Append(vals[j]); } } } else { valStr.Append(vals[]); } foreach (PropertyInfo pro in Properties)//遍历该类所有属性 { if (pro.Name.ToLower().Equals(keyStr.ToLower())) { pro.SetValue(bean, valStr.ToString()); } } } return bean; } public static void CopyProperties<T,W>(T source, W target) { PropertyInfo[] Properties = typeof(T).GetProperties(); PropertyInfo[] wProperties = typeof(W).GetProperties(); foreach (PropertyInfo wPro in wProperties)//遍历该类所有属性 { foreach (PropertyInfo pro in Properties)//遍历该类所有属性 { if (wPro.Name.ToLower().Equals(pro.Name.ToLower()) && wPro.PropertyType.Equals(pro.PropertyType)) { wPro.SetValue(target, pro.GetValue(source)); } else if (wPro.Name.ToLower().Equals(pro.Name.ToLower()) && !wPro.PropertyType.Equals(pro.PropertyType)) { if (wPro.PropertyType.Equals(typeof(DateTime))) { try { wPro.SetValue(target, Convert.ToDateTime(pro.GetValue(source))); } catch (Exception) { throw new DateFormatError("日期格式不正确"); } break; } if (wPro.PropertyType.Equals(typeof(int))) { try { wPro.SetValue(target, Convert.ToInt32(pro.GetValue(source))); } catch (Exception) { throw new NotANumber("输入的不是一个数字"); } break; } if (wPro.PropertyType.Equals(typeof(double)) || wPro.PropertyType.Equals(typeof(float))) { try { wPro.SetValue(target, Convert.ToDouble(pro.GetValue(source))); } catch (Exception) { throw new NotANumber("输入的不是一个数字"); } break; } } } } } } }
接下来刚才我们的封装就可以改成这样:
<%@ WebHandler Language="C#" Class="RequestHandler" %> using System; using System.Web; using zze; public class RequestHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { EUser user = BeanUtil.FillBean<EUser>(context.Request); //之后对User进行业务处理.... } public bool IsReusable { get { return false; } } }
是不是简短清新了很多,注意这里的EUser属性名要和Request中的参数键名相同.
此时有些同学可能注意到了,我们之前的属性都是string类型的,所以表单中的数据可以很容易的通过反射进行赋值,假如我们属性中出现了其它类型呢?如下:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form action="RequestHandler.ashx"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密码:</td> <td><input type="text" name="userPwd" /></td> </tr> <tr> <td>年龄:</td> <td><input type="text" name="Age" /></td> </tr> <tr><td colspan="2"><input type="submit" value="提交"/></td></tr> </table> </form> </body> </html>
此时我们有个年龄字段,作为demo演示我们可以给它int类型.
这里按照beanutils的使用来说,因为用户在前台页面上的输入都可以用字符串来接收,所以我们可以用一个和页面表单对应的而且属性类型都是string实体来接收,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; public class UserFormBean { public string Username { get; set; } public string UserPwd { get; set; } public string Age { get; set; } }
这个实体没什么业务意义,纯粹用来接收来自请求的参数内容,与其对应的实体如下,包含一个int属性:
using System; using System.Collections.Generic; using System.Linq; using System.Web; public class EUser { public string Username { get; set; } public string UserPwd { get; set; } public int Age { get; set; } }
RequestHandler就可以改成如下代码了:
<%@ WebHandler Language="C#" Class="RequestHandler" %> using System; using System.Web; using zze; public class RequestHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { UserFormBean userFormBean = BeanUtil.FillBean<UserFormBean>(context.Request); EUser user = new EUser(); BeanUtil.CopyProperties<UserFormBean, EUser>(userFormBean, user);//该方法的作用是将一个属性和其对应的对象的值copy给自己,并完成相应属性的类型转换,第一个参数是copy的来源,第二个参数是copy的目标 //之后对User进行业务处理.... } public bool IsReusable { get { return false; } } }
执行上述代码会发现EUser中的age会成功赋值,当然前台age文本框的值要符合int格式.
asp.net中Request请求参数的自动封装的更多相关文章
- 详细解析ASP.NET中Request接收参数乱码原理
起因:今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: < ...
- Asp.net中Request.Url的各个属性对应的意义介绍
Asp.net中Request.Url的各个属性对应的意义介绍 本文转载自 http://www.jb51.net/article/30254.htm 网络上关于Request.Url的说明已经很多也 ...
- SpringMVC中post请求参数注解@requestBody使用问题
一.httpClient发送Post 原文https://www.cnblogs.com/Vdiao/p/5339487.html public static String httpPostWithJ ...
- 用WIN7系统IIS的提示:数据库连接出错,请检查Conn.asp文件中的数据库参数设置
我用科讯的从4.0开始,去年开始很少用科讯做新站了,今天拿来做一下,结果悲剧了,数据库路径老是不对,百度一番又一番的,,最后终于给度娘解决了.分享出来给遇到同样的问题的人. 用WIN7系统IIS的注意 ...
- ASP.NET中使用JavaScript实现图片自动水平滚动效果
参照网上的资料,在ASP.NET中使用JavaScript实现图片自动水平滚动效果. 1.页面前台代码: <%@ Page Language="C#" AutoEventWi ...
- js处理url中的请求参数(编码/解码)
在处理 a 链接跳转其他页面时,总会遇到需要传递一些当前页面的信息到其他页面,然后其他页面利用这些信息进行相关操作.利用 get 请求或 hash 传递是常见的方式. 首先,需要对传递的参数进行编码, ...
- request请求参数与http请求过程
request请求参数
- angular开发中对请求数据层的封装
代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...
- http.request请求及在node中post请求参数解析
Post请求 var http=require('http'); var qs=require('querystring'); var post_data={a:123,time:new Date() ...
随机推荐
- Fidder
第一步:下载Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler 打开Fiddler, Tools ...
- WP8.1学习系列(第二十七章)——ListView和GridView入门
快速入门:添加 ListView 和 GridView 控件 (XAML) 在本文中 先决条件 选择 ListView 或 GridView 将项添加到项集合 设置项目源 指定项目的外观 指定视图 ...
- 【laravel5.6】The Process class relies on proc_open, which is not available on your PHP installation.
部署服务器的时候,使用composer来安装依赖.遇到了 解决办法: 在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,如果有的话,去掉即可
- 【!Important】Java线程死锁查看分析方法
一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们提过的工具JConsole,可以通过cmd打开命令框然后输入Jconsole打开图形工具 然后点击检测死锁就可以查看 ...
- HashMap和Hashtable的区别 2
导读: 1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null k ...
- C# 读写Excel的一些方法,Aspose.Cells.dll
需求:现有2个Excel,一个7000,一个20W,7000在20W是完全存在的.现要分离20W的,拆分成19W3和7000. 条件:两个Excel都有“登录名”,然后用“登录名”去关联2个Excel ...
- Pyramid Analytics宣布无缝集成BI Office和微软Power BI Desktop
全球领先的企业商业智能(BI)软件提供商Pyramid Analytics与微软联手,凭借完善的分析平台BI Office强化Power BI Desktop的个人生产力功能.新的“Publish t ...
- Mysql 全文搜索 Match Against用法
全文检索在 MySQL 中就是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE ...
- Jenkins插件管理
1.配置jenkins需要的maven.jdk路径 [root@db01 secrets]# echo $JAVA_HOME /application/jdk [root@db01 secrets]# ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...