在做一些网站时偷懒使用动软来生成工厂模式的三层结构时,能为工作减轻不少重复的负担,包括其中生成的WebSite中一些Show、Modify、Add页面,能很快实现对应Model的简单添加查看编辑功能,但是没有相关的查询功能。便写了个相关用于查询的自定义属性及用户控件来生成对应Model的查询页面,可查询的字段可以通过自定义属性来进行定义,然后通过反射来生成每个字段的用户控件供用户选择查询。

首先创建测试实体类及相关的自定义属性,代码如下:

Code
  1/**//// <summary>
  2/// 测试用实体类
  3/// </summary>
  4public class Partment
  5{
  6    public Partment()
  7    {
  8        //
  9        // TODO: 在此处添加构造函数逻辑
 10        //
 11    }
 12
 13    private string name;
 14    private string age;
 15    private string department;
 16    private string salary;
 17    private bool invalid;
 18
 19    [MyCustom("无效",MyCustomType.Query)]
 20    public bool Invalid
 21    {
 22        get
 23        {
 24            return invalid;
 25        }
 26        set
 27        {
 28            invalid = value;
 29        }
 30    }
 31     [MyCustom("年龄",MyCustomType.Query)]
 32    public string Name
 33    {
 34        get
 35        {
 36            return name;
 37        }
 38        set
 39        {
 40            name = value;
 41        }
 42    }
 43
 44    public string Age
 45    {
 46        get
 47        {
 48            return age;
 49        }
 50        set
 51        {
 52            age = value;
 53        }
 54    }
 55
 56    [MyCustom("部门",MyCustomType.Query)]
 57    public string Department
 58    {
 59        get
 60        {
 61            return department;
 62        }
 63        set
 64        {
 65            department = value;
 66        }
 67    }
 68    
 69    
 70    public string Salary
 71    {
 72        get
 73        {
 74            return salary;
 75        }
 76        set
 77        {
 78            salary = value;
 79        }
 80    }
 81
 82}
 83
 84public enum MyCustomType
 85
 86    Query,
 87    Edit,
 88    Show
 89}
 90
 91[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
 92public class MyCustomAttribute:Attribute
 93{
 94    private string alias;
 95    private MyCustomType customType;
 96    public MyCustomAttribute(string alias_cn, MyCustomType myCustomType)
 97    {
 98        alias = alias_cn;
 99        customType = myCustomType;    
100    }
101    /**//// <summary>
102    /// 中文名称,用以在页面显示
103    /// </summary>
104    public string Alias
105    {
106        get
107        {
108            return alias;
109        }
110        set
111        {
112            alias = value;
113        }
114    }
115    /**//// <summary>
116    /// 设置字段是否可查询,删除等
117    /// </summary>
118    public MyCustomType CustomType
119    {
120        get
121        {
122            return customType;
123        }
124        set
125        {
126            customType = value;
127        }
128    }
129
130}

创建完毕后再创建字段通用的用户控件,该控件包含3个子控件,2个CheckBox,1个TextBox,当字段属于Bool类型时显示两个CheckBox,如果字段是其它类型则显示一个CheckBox,一个TextBox供用户输入。另讲各个子空间的Text和可见性公开属性,让动态生成该控件时可以很好控制其对应的属性。代码如下:

Code
 1 protected void Page_Load(object sender, EventArgs e)
 2    {
 3        CheckBox1.Text = ck1Name;
 4        CheckBox2.Text = ck2Name;
 5        CheckBox2.Visible = showck2;
 6        TextBox1.Visible = showtb;
 7    }
 8
 9    private string ck2Name;
10    private string ck1Name;
11    private bool showck2;
12    private bool showtb;
13    
14    
15    public string Ck2Name
16    {
17        get
18        {
19            return ck2Name;
20        }
21        set
22        {
23            ck2Name = value;
24        }
25    }
26    public string Ck1Name
27    {
28        get
29        {
30            return ck1Name;
31        }
32        set
33        {
34            ck1Name = value;
35        }
36    }
37    public bool ShowCk2
38    {
39        get
40        {
41            return showck2;
42        }
43        set
44        {
45            showck2 = value;
46        }
47    }
48
49    public bool ShowTb
50    {
51        get
52        {
53            return showtb;
54        }
55        set
56        {
57            showtb = value;
58        }
59    }

写好完毕,我们就可在页面中开始利用反射动态生成上面创建的用户控件。读取Model中的每个属性值,判断是否可以进行查询的自定义属性,如果是可查询的则将动态生成对应的用户控件,并读取自定义属性的一些信息,如中文名称赋值显示。代码如下:

Code
 1 foreach (PropertyInfo pi in typeof(Partment).GetProperties())
 2            {
 3                
 4                foreach (MyCustomAttribute mca in pi.GetCustomAttributes(typeof(MyCustomAttribute),false))
 5                {
 6                    bool isQuery = false;
 7                    if (mca.CustomType == MyCustomType.Query)
 8                    {
 9                        isQuery = true;
10                    }                
11                    if (isQuery)
12                    {
13                        QueryControl qc =LoadControl("~/QueryControl.ascx") as QueryControl;
14                        qc.ID = pi.Name;
15                        
16                        if (pi.PropertyType.FullName==typeof(bool).FullName)
17                        {
18                            qc.ShowCk2 = true;
19                            qc.ShowTb = false;
20                            qc.Ck2Name = mca.Alias;
21                        }
22                        else
23                        {
24                            qc.Ck1Name = mca.Alias;
25                            qc.ShowTb = true;
26                            qc.ShowCk2 = false;                            
27                        }
28                        PlaceHolder1.Controls.Add(qc);
29                    }
30                }         
31                           
32            }     

在查询时,我们可遍历所有字段,看是否网页中存在对应字段的用户控件,存在则开始判断是否选中及其假如选中其该字段对应用户输入的值或是否有选择(bool类型的字段),然后通过bll.GetAllList(whereClause)来实现查询。如果可以的话应该可以通过CodeSmith等软件来完成该过程的自动自动生成,可惜不是很熟悉。要实现其它Model查询时,只要在对应字段设置自定义属性及将动态生成时的类换成对应的Model类即可。

转载于:https://www.cnblogs.com/hjcook/archive/2008/12/12/1353366.html

ORM Model查询页生成相关推荐

  1. php8预加载,如何利用预加载优化Laravel Model查询详解

    前言 本文主要给大家介绍了关于利用预加载优化Laravel Model查询的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 介绍 对象关系映射(ORM)使数据库的工作变得非常简单 ...

  2. Django的model查询操作 与 查询性能优化

    Django的model查询操作 与 查询性能优化 1 如何 在做ORM查询时 查看SQl的执行情况 (1) 最底层的 django.db.connection 在 django shell 中使用 ...

  3. Laravel最佳实践--根据搜索参数为Model查询应用不同的Where条件

    我们平时使用Laravel的Model查询当查询应用了多个条件的时候一般都是链式调用,像下面这样: User::where('age', '=', 18)->where('sex', '=', ...

  4. 通过JS代码动态生成HTML表格(Table),Input框,Button按钮.并且通过Input框的值进行查询动态生成数据填写在指定的表格里

    本人公众号上线啦!!! 公众号与博客名一样:没有腹肌的程序猿 公众号文章类型:工作上所遇到的需求实现方案分享. 此外也会提供一些数据集供大家使用.(这个还在规划中,毕竟打工人时间挺紧的,哈哈哈哈) 到 ...

  5. Beego脱坑(十四)ORM高级查询

    title: Beego脱坑(十四)ORM高级查询 tags: go,beego,orm author : Clown95 本文将讲述beego ORM的一些高级查询,这也是ORM最核心的部分,本文所 ...

  6. 静态页转换平台(StaticPol)-静态页生成终极解决方案

    我本身非常不喜欢写文字材料,但是这个东西相信是很多人都需要的,把心得写出来和大家分享一下,也好让大家都努力PP,以助于尽快完善这个东东,早日贴出来供大家下载使用. 为什么要生成静态页? 这个问题咱们就 ...

  7. php 织梦wap源码,织梦手机静态页生成插件 DEDE WAP静态化 手机端生成静态

    织梦手机静态页生成插件 织梦手机端本身默认没有静态,很多客户都想做手机端静态,这次你们有福了, 织梦手机静态页生成插件是一个安装后,可以生成手机版静态页,提高手机版网页的访问速度,更加有利于SEO. ...

  8. 用XMLHTTP获取动态页生成的HTML内容

    用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件.这句话是在蓝色理想上看到的,对XMLHTTP吟清还 ...

  9. 静态页转换平台(StaticPol)-静态页生成终极解决方案(转)

    静态页转换平台(StaticPol)-静态页生成终极解决方案(转) from  http://www.cnblogs.com/pbwf/ 我本身非常不喜欢写文字材料,但是这个东西相信是很多人都需要的, ...

最新文章

  1. Android开发工程师面试指南
  2. 你必须懂的 T4 模板:深入浅出
  3. 这个太有意思了,程序员可以消遣娱乐
  4. DB2新建编目及删除编目
  5. hdu 6149 Valley Numer II(01背包套状压dp)
  6. 为什么不能用速度与时间的关系去实现动画
  7. 关于Vector,map等迭代器问题
  8. 电够动力足——认识主板上的CPU供电模块
  9. Win9X、2000、XP、2003所有注册表设置
  10. c语言在线考试系统的需求分析,在线考试系统需求分析.doc
  11. Java实现手机号邮箱号登录_手机号、邮箱或者用户名登录的实现方法
  12. 网络安全实战之植入后门程序
  13. 思维 POJ - 2361 Tic Tac Toe
  14. Web前端低代码介绍的ppt大纲
  15. 智慧养老、养老运营服务平台、陪护服务、养老院、托养、敬老院、健康管理、日常护理、残疾人管理、线下援助服务、助餐、助洁、助医、生活照料、养生保健、社区养老、居家养老、服务回访、健康数据、Axure原型
  16. 锐捷网络:校园网基于802.1x无感知认证
  17. Python 常用的占位符
  18. k8s event 事件输入elk 并设置钉钉报警
  19. Macbook Pro 外接显卡实现Tensorflow GPU运行之环境配置(重点)
  20. dlib.get_frontal_face_datector()人脸位置检测

热门文章

  1. 如果你负债累累,上班已经不能还账,又没有创业资金,该怎么办?
  2. 黑客是否可以攻击被拔掉网线的电脑?
  3. 要想完全放弃Windows使用Linux需要多少勇气?
  4. 为什么有的安卓手机会越用越卡?
  5. 如何用管程实现生产者消费者问题?
  6. 在SQL Server中使用SQL Coalesce函数
  7. ssis导入xml_使用SSIS包将XML文档导入SQL Server表
  8. ssis 循环导入数据_使用集成服务(SSIS)包从Amazon S3 SSIS存储桶导入数据
  9. 编译加速 remote cache
  10. HDU - 6333 Harvest of Apples