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>

大家请别扔砖头,呵呵.

请各位站长看看下面>>>

posted on   cestarme  阅读(3121)  评论(7编辑  收藏  举报

编辑推荐:
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 数据并发安全校验处理工具类
< 2011年6月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示