C#用反射将Model类动态载入表单 利用Velocity传值 调用只需一句代码
通常我们在编辑内容的时候会用将原来的数据载入到这个表单里面来,以便用户直接更改.
代码与如下类似:
if (Labs.Utils.ValidateUtil.IsNumber(ActionId)) { int ActionIdForInt = Convert.ToInt32(ActionId); model = bll.GetModel(ActionIdForInt); if (model != null) { //这里我用到了VTL模板引擎 VelocityContext.Put("CmsType", model.CmsType); VelocityContext.Put("ConnectionString", model.ConnectionString); VelocityContext.Put("DataBaseType", model.DataBaseType); VelocityContext.Put("DevLang", model.DevLang); VelocityContext.Put("Id", model.Id); VelocityContext.Put("SiteDomain", model.SiteDomain); VelocityContext.Put("Title", model.Title); //或者是 this.TextBox.Text=model.CmsType; … } else Page.ErrMsg = validate.nodata_err; } else Page.ErrMsg = validate.id_format_err;
上面代码中非常的繁琐,而且枯燥无味,最恼火的是很容易出错,感觉就像在写asp代码样.如下方法就能够解决上面问题.
/// <summary> /// 将实体类的属性值转为Velocity供前台页面中使用 /// </summary> /// <param name="obj">实体类</param> public static void ModelToVTL(object obj) { Type t = obj.GetType(); System.Reflection.PropertyInfo[] Property = t.GetProperties(); foreach (System.Reflection.PropertyInfo pi in Property) { VelocityContext.Put(pi.Name, new Labs.Web.UserDataReflection.BLL().GetModelValue(pi.Name, obj)); } }
利用反射获取实体类里面的公有属性,然后遍历,设置VTL值.OK.
里面还用到了一个GetModelValue这个方法,其实在上一篇日志里面我已经写过代码了,获取类某个成员属性.这里再贴一下,代码如下:
/// <summary> /// 获取类中的属性值 /// </summary> /// <param name="FieldName"></param> /// <param name="obj"></param> /// <returns></returns> public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value)) return null; return Value; } catch { return null; } }
调用方法:
if (Labs.Utils.ValidateUtil.IsNumber(ActionId)) { int ActionIdForInt = Convert.ToInt32(ActionId); model = bll.GetModel(ActionIdForInt); if (model != null) { Labs.Web.WebPublic.ModelToVTL(model);//看见没有,就这么一句哟.
} else Page.ErrMsg = validate.nodata_err; } else Page.ErrMsg = validate.id_format_err;
这种方法调用简单,不易出错,但是前台的设置时,Name值要与属性值相同,不然就会调不上的.
再贴一下前台设置的代码,这里我用到了VTL,不同的页面结构要用不同的方法哟.
<form action="${Url}" method="post" name="addForm"> <li> <span class="color_f00">*</span> 域 名:<br> <input type="text" name="SiteDomain" value="$!{SiteDomain}" class="input1" onblur="LoadSite(this.value)" /> <span class="color_999">如"www.xinlg.com",不包含"http://"</span> </li> <li class="DataBaseType"> <span class="color_f00">*</span> 数据库类型:<br> <select name="DataBaseType" id="DataBaseType"> <option value="">--选择数据库类型--</option> #foreach($db in ${DataBaseType_D}) <option value="$db">$db</option> #end </select> </li> <li class="ConnectionString"> <span class="color_f00">*</span> 数据库连接字串:<br> <input type="text" name="ConnectionString" style="width:50%" value="$!{ConnectionString}" class="input1" /> </li> #if(${display}) <div class="box"> <li> 服务器名称<span class="color_999">(如有特定端口需要包含在里面)</span>:<br> <input type="text" id="sql_Server" /> </li> <li> 用户名:<br> <input type="text" id="sql_User" /> </li> <li> 密码:<br> <input type="text" id="sql_Password" /> </li> </div> #end <li> <span class="color_f00">*</span> 标 题:<br> <input type="text" name="Title" class="input1" value="$!{Title}" /> </li> <li class="line"> 开发语言:<br> <select name="DevLang" id="DevLang"> <option value="">--选择开发语言--</option> #foreach($lang in ${DevLang_D}) <option value="$lang">$lang</option> #end </select> </li> <li> 网站系统:<br> <input type="text" name="CmsType" id="CmsType" class="input1" value="$!{CmsType}" /> << <select onchange="$('#CmsType').val(this.value);"> <option value="">--请选择--</option> #foreach($Cms in ${CmsType_D}) <option value="$Cms">$Cms</option> #end </select> </li> #if(${Action}=="edit") <li><input type="submit" value="修 改" name="editBtn" class="btn1" /></li> #else <li><input type="submit" value="添 加" name="addBtn" class="btn1" /></li> #end </form>
大家请别扔砖头,呵呵.
请各位站长看看下面>>>