一般处理程序的救星!利用反射一招叫你摆脱丑比代码
我们一般做异步请求数据的时候,都是通过post或者get提交数据。
我们后台接收post或者get数据的方式一般是这样的。。。
int companyId = int.Parse(context.Request.Form["CompanyId"]); //公司ID
int goodsTypeId = int.Parse(context.Request.Form["GoodsType"]); //产品类别
string goodsName = context.Request.Form["GoodsName"]; //产品名称
decimal nowPrice = decimal.Parse(context.Request.Form["NowPrice"]); //现价
decimal costPrice = decimal.Parse(context.Request.Form["CostPrice"]);//成本价
int goodsSubType = int.Parse(context.Request.Form["GoodsSubType"]); //是否是相册类产品
decimal albumPagePrice = decimal.Parse(context.Request.Form["AlbumPagePrice"]); //每P单价
int defaultPageNumber = int.Parse(context.Request.Form["DefaultPageNumber"]);//默认P数
int goodsSort = int.Parse(context.Request.Form["GoodsSort"]);//排序
string remark = context.Request.Form["Remark"]; //备注
string branchIds = context.Request.Form["BranchIds"];//分店信息
一般我们拿到post过来的数据,然后赋值给实体。具体代码一般是这样。。
int companyId = int.Parse(context.Request.Form["CompanyId"]); //公司ID
int goodsTypeId = int.Parse(context.Request.Form["GoodsType"]); //产品类别
string goodsName = context.Request.Form["GoodsName"]; //产品名称
decimal nowPrice = decimal.Parse(context.Request.Form["NowPrice"]); //现价
decimal costPrice = decimal.Parse(context.Request.Form["CostPrice"]);//成本价
int goodsSubType = int.Parse(context.Request.Form["GoodsSubType"]); //是否是相册类产品
decimal albumPagePrice = decimal.Parse(context.Request.Form["AlbumPagePrice"]); //每P单价
int defaultPageNumber = int.Parse(context.Request.Form["DefaultPageNumber"]);//默认P数
int goodsSort = int.Parse(context.Request.Form["GoodsSort"]);//排序
string remark = context.Request.Form["Remark"]; //备注
string branchIds = context.Request.Form["BranchIds"];//分店信息
Models.Goods.GoodsInfo model = new Models.Goods.GoodsInfo();
model.GoodsTypeId = goodsTypeId;
model.GoodsName = goodsName;
model.NowPrice = nowPrice;
model.CostPrice = costPrice;
model.GoodsSubType = goodsSubType;
model.AlbumPagePrice = albumPagePrice;
model.DefaultPageNumber = defaultPageNumber;
model.GoodsSort = goodsSort;
model.GoodDescription = remark;
model.BranchIds = branchIds;
model.CompanyId = companyId;
如果post过来30个参数,就要拼30遍,你们说这代码 # 丑比不丑比!!!!
来,我用一招拯救你。
我上面的代码,可以用两句代码来表示。
Models.Goods.GoodsInfo model = new Models.Goods.GoodsInfo();
model = KLY.Common.RequestDataHelper<Models.Goods.GoodsInfo>.PostDataToModel(context, model);
具体就是RequestDataHelper 这个帮助类。
通过反射把post过来的数据,直接转换成实体。
RequestDataHelper帮助类代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace KLY.Common
{
public class RequestDataHelper<T>
{
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <param name="model"></param>
/// <returns></returns>
public static T PostDataToModel(HttpContext context,T model)
{
Type t = model.GetType();
PropertyInfo[] pis = t.GetProperties();
foreach (PropertyInfo pi in pis)
{
if (!string.IsNullOrEmpty(context.Request.Form[pi.Name]))
{
Type type = pi.PropertyType;
Type underlyingType = Nullable.GetUnderlyingType(type);
pi.SetValue(model, Convert.ChangeType(context.Request.Form[pi.Name],underlyingType??type));
}
}
return model;
}
}
}
不过我这种有局限性,只适用于实体的属性和post的参数名字一致的情况。(像我这种人,一般都是代码生成器生成,所以一般都是一致的。。。)
修改记录
2016.04.18 当实体有null的情况,转换成实体失败问题修改。
参考文献。
http://www.cnblogs.com/patrickyu/p/3211115.html
修改记录:
Type type = pi.PropertyType;
Type underlyingType = Nullable.GetUnderlyingType(type);
pi.SetValue(model, Convert.ChangeType(context.Request.Form[pi.Name],underlyingType??type));
文章如果对你有帮助,来点个赞~
如果有意见,来吐个槽也行!_
写个博客不容易,请转载的时候备注下原文出处,谢谢
作者:keepnode
博客地址:http://www.cnblogs.com/woaic
每件事到最后都是好事,如果不是好事,说明还没有到最后
=========================
作者:keepnode
博客地址:http://www.cnblogs.com/woaic
每件事到最后都是好事,如果不是好事,说明还没有到最后
=========================