[DotNet]利用反射自动将Web前台传递的数据初始化到对象中
Web程序的前后台数据传递一直比较繁琐,最简单的方式可能是form提交后台提取信息进行判断。用 Python 开发习惯了Dict 格式参数的方便。最近帮朋友处理一个 DotNet 程序的时候,突然感觉这些数据传递处理别扭了。前台传递过来的数据后台需要一个个的对应到ORM对象中,实在是太麻烦了。
有没有更好更方便的方式呢? 于是有了下面的思路。
假设做一个约束,将Web Html中元素的ID 、 Name和后台对象字段名一至, 然后利用DotNet反射提取对象字段值和
Form提交来的名称对应赋值,就自动完成了对象数据的初始化。
代码测试一下,还是挺好用的 呵呵,如果处于安全考虑,Web Form提前可以用js进行数据校验,后台赋值时也可以跟
据数据类型进行校验,同样可以DoubleCheck 呵呵。。。
示例代码
HTML部分
<form id="form1" name="form1">
<table border="1" cellspacing="0" cellpadding="0" class="addlm">
<tr id="first">
<td colspan="5" class="thead boldblue">添加权限</td>
</tr>
<tr>
<td>权限名称:</td>
<td><input id="Name" name="Name" type="text" class="onelinetext" value=""
/></td>
</tr>
<tr>
<td> </td>
<td>
<input id="btnCreate" type="button" class="bgsubmit" value="确定"/>
</td>
</tr>
</table>
</form>
JS部分
/// 创建栏目
function CreatePermission() {
var validate = new Validate().validate(
{
Name: { min: 1, message: "名称不能为空!" }
});
if (validate) {
var per = new Permission();
per.create($("#form1").serializeArray());
}
}
--------------
// 创建
prototype.create = function(permission, callback) {
$.post("/Permission/DoCreatePermission", permission,
function(data) {
if (data == "Success")
{
alert("创建成功!");
}
else {
alert("创建失败!");
}
if (!isUndefinedOrNull(callback)) callback(data.Result);
if (data == "Success") TextBoxAllClear();
});
};
DotNet部分
var per = this.GetArguments(new Permission(), this.Request.Form); // 调用
// 示例
/// <summary>
/// 获取参数值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
protected T GetArguments<T>(T t, System.Collections.Specialized.NameValueCollection form)
{
// 提取所有Key值,并转化成小写
List<string> keys = new List<string>();
foreach (var k in form.AllKeys)
{
keys.Add(k.ToLower());
}
// 构造实例类型,并设置属性值
foreach (PropertyInfo pi in t.GetType().GetProperties())
{
if (keys.Contains(pi.Name.ToLower()))
{
var value = Convert.ChangeType(form.Get(pi.Name), pi.PropertyType);
pi.SetValue(t, value, null);
}
}
return t;
}