Web程序的前后台数据传递一直比较繁琐,最简单的方式可能是form提交后台提取信息进行判断。用 Python 开发习惯了Dict 格式参数的方便。最近帮朋友处理一个 DotNet 程序的时候,突然感觉这些数据传递处理别扭了。前台传递过来的数据后台需要一个个的对应到ORM对象中,实在是太麻烦了。
有没有更好更方便的方式呢? 于是有了下面的思路。
假设做一个约束,将Web Html中元素的ID 、 Name和后台对象字段名一至, 然后利用DotNet反射提取对象字段值和Form提交来的名称对应赋值,就自动完成了对象数据的初始化。代码测试一下,还是挺好用的 呵呵,如果处于安全考虑,Web Form提前可以用js进行数据校验,后台赋值时也可以跟据数据类型进行校验,同样可以DoubleCheck 呵呵。。。示例代码
HTML部分
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); // 调用 // 示例 ////// 获取参数值 /// /// ///protected T GetArguments (T t, System.Collections.Specialized.NameValueCollection form) { // 提取所有Key值,并转化成小写 List keys = new List (); 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; }