【自然框架】之 “表单控件”与“实体类”

      对于简单的添加、修改,也就是没有什么业务逻辑的那种,表单控件的工作步骤是这样的,以添加数据为例。这个不用写什么代码,点点鼠标就可以搞定了。

      但是对于复杂的业务逻辑的需求,就不能这么“点点鼠标”就搞定了。这时候我们就需要在流程中间插入了一个步骤——业务处理。这个就需要写代码了,如下图:

      先定义一个实体类,然后表单控件可以自动把用户输入的信息赋值给实体类的属性,然后我们就可以进行各种业务处理了,处理完毕之后,表单控件又可以自动接收实体类的属性值,继续后面的步骤。

      这样呢,对于简单的没有什么业务逻辑的,就可以简单处理,点点鼠标就ok了。而对于需要做复杂处理的,我们可以在中间插入一步,写一点代码了。有一点加钩子的意思。这样无论是简单的还是复杂的我们都可以处理了。

      请注意,我并没有说,加上了一个实体类,我的这个设计OO了,OO是一件任重而道远的事情,也是很难掌握的,至少我是这么感觉的。在这里使用实体类只不过是为了方便处理业务逻辑,并不是为了向OO靠拢,我的原则还是“顺其自然,该用什么就用什么,什么适合就用什么”。而且,我也不能确定这个是不是可以叫做“实体类”,但是这个至少可以叫做“类”。

      可能你会感觉这个有点像ORM,确实有一点点像,注意我可没有说我的这个是ORM。人家ORM只管持久化,根本就不管绘制表单、获取用户输入的信息(注意我不是说这样做不对)。

      我这个人是很懒的,我就让表单控件做这做那,他多做点事情,我就少写点代码,呵呵。所以我就让表单控件不仅可以绘制表单、提取用户输入的信息、前台的信息验证、后台的“数据类型验证”,还要可以拼接SQL语句、拼接参数化的SQL,还要可以弄出来存储过程的参数,最后呢还要在修改数据的时候可以从数据库里面提取数据绑定控件

      当然了有两件事情没有让他做,一个就是和ADO(DbCommand、DbConnection等)打交道,另一个就是做“业务处理”。

      表单控件是如何自动给属性赋值的呢?利用了Attribute和反射。前天下午向“横刀天笑”请教了一下Attribute的使用方法,又参考了一下的贴子。终于实现了我的这个想法。只需要在定义实体类的时候给属性多加一个Attribute就可以了。

【定义一个Attribute的代码】

namespace Nature.Common
{
 /// <summary>
 /// 记录字段ID,用于属性和字段的对应关系。
 /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
 public sealed class ColumnIDAttribute : Attribute
    {
 /// <summary>
 /// 字段ID
 /// </summary>
 private int columnID;
 
 /// <summary>
 /// 字段ID,即字段编号
 /// </summary>
 public int ColumnID
        {
 get { return columnID; }
 set { columnID = value; }
        }

 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="value"></param>
 public ColumnIDAttribute(int value)
        {
            columnID = value;
        }
    }
}

【表单控件里面自动给实体类的属性赋值的代码】 

/// <summary>
 /// 自动给实体类的属性赋值
 /// </summary>
 /// <param name="obj">实体类</param>
 /// <returns></returns>
 public void FillClass(object obj )
        {
 
 //获取类里面的属性
            PropertyInfo[] infos = obj.GetType().GetProperties();   // typeof(obj).GetProperties();

 #region 遍历属性
 foreach (PropertyInfo info in infos)
            {
 //获取属性里的ColumnIDAttribute的值
                ColumnIDAttribute columnID = (ColumnIDAttribute)info.GetCustomAttributes(typeof(ColumnIDAttribute), false)[0];

 if (dic_BaseCols[columnID.ColumnID] != null)
                {
                    info.SetValue(obj, dic_BaseCols[columnID.ColumnID].ColValue, null);  //赋值
                }
            }
 #endregion

        }

【表单控件里面获取实体类的属性值的代码】 

 /// <summary>
 /// 获取实体类的属性值
 /// </summary>
 /// <param name="obj">实体类</param>
 /// <returns></returns>
 public void ExtractClass(object obj)
        {
 //获取类里面的属性
            PropertyInfo[] infos = obj.GetType().GetProperties(); ;

 #region 遍历属性
 string tmpValue = "";
 foreach (PropertyInfo info in infos)
            {
 //获取属性里的ColumnIDAttribute的值
                ColumnIDAttribute columnID = (ColumnIDAttribute)info.GetCustomAttributes(typeof(ColumnIDAttribute), false)[0];

 if (dic_BaseCols[columnID.ColumnID] != null)
                {
                    tmpValue = info.GetValue(obj, null).ToString();  //取值
                    dic_BaseCols[columnID.ColumnID].ColValue = tmpValue;

 //绑定控件
 this.SetControlValue(columnID.ColumnID.ToString(), tmpValue);
                }
            }
 #endregion

        }

 【如何使用的代码】

/// <summary>
    /// 功能节点的辅助类
    /// </summary>
    public class MyNote
    {
        属性
}


MyNote myNote = new MyNote();

//获取是要添加子节点,还是兄弟节点
string addNoteKind = Request.QueryString["n"];
if (addNoteKind == "1")
    myNote.SetSonNote(dal,this.DataID);
else
   myNote.SetBortherNote(dal, this.DataID);

//表单控件接收属性值
Form_Base.ExtractClass(myNote);

不过想一想,这么做了之后,还真是可以换用其他的ORM了,只是不知道对于实体类的定义要不要作修改,因为我没有用过其他的ORM。

总结:

1、 简单的、没有业务逻辑的添加、修改的操作,直接让表单控件全权负责就可以了。 2、 有业务逻辑的,那么就根据需要定义一个实体类,让表单控件自动赋值,然后我们就可以做业务处理(这是就需要写代码了)。最后表单控件会自动接收实体类的属性值。

3、 实体类的定义可以有代码生成器生成。(我的代码生成器暂时没有完成)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT开发技术与工作效率

VBA登录抓取网络数据

31240
来自专栏老马寒门IT

jQuery EasyUI 详解

easyui 为创建现代化,互动,JavaScript 应用程序,提供必要的功能。

57310
来自专栏7号代码

Android应用界面开发——Widget(实现液晶时钟)

桌面控件是通过BroadcastReceiver的形式进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver。开发桌面控件时,只需继承Bro...

28560
来自专栏Young Dreamer

html5之histroy浅析

history是HTML5的新特性,我们可以使用它操作这个历史记录堆栈。 (1)history提供了对浏览器历史纪录堆栈的读取,同时实现在访问记录中的前进和后退...

21970
来自专栏强仔仔

利用js实现输入框动态提示信息

为了提高和用户的交互性,现在的输入框往往都采用输入信息自动提示的功能,类似于百度输入框中的提示功能。 设计思路是:在输入框input的组件下面放置一个div,这...

77260
来自专栏GIS讲堂

基于Arcgis for Js的web GIS数据在线采集简介

在前一篇博文“Arcgis for js之WKT和geometry转换”中实现了wkt和geometry之间的相互转化,博文原文地址为:http://blog....

15320
来自专栏向治洪

ios开发之xcode环境介绍

作为一个刚入门ios开发的人来说,对于ios开发,对于xcode一切都是那么的陌生,那么我们如何开始我们的第一步呢?首先对开发的ide是必须要了解的,其实要对开...

28160
来自专栏Java帮帮-微信公众号-技术文章全总结

05.HTML脚本/字符实体/URL/速查列表/

05.HTML脚本/字符实体/ URL/速查列表/ HTML 脚本 ---- JavaScript 使 HTML 页面具有更强的动态和交互性。 ---- HTM...

38840
来自专栏智能大石头

手工调试自定义控件各主要方法执行顺序(分运行时和设计时)

继承TextBox,override各个方法,分别下断点调试。 ctor为构造函数 在构造函数中,通过代码: this.Text = (new Random(D...

226100
来自专栏Debian社区

Web前端知识体系精简

Web前端技术由html、css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从...

22630

扫码关注云+社区

领取腾讯云代金券