[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>&nbsp;</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;
}
posted @ 2011-07-16 21:40  ABeen  阅读(554)  评论(0编辑  收藏  举报