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

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

 

      

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

  

 

 

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

 

 

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

      这样呢,对于简单的没有什么业务逻辑的,就可以简单处理,点点鼠标就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

        }

 

 【如何使用的代码】

 

img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif /**/ /// <summary>
    
/// 功能节点的辅助类
    
/// </summary>

     public   class  MyNote
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    
{
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
属性#region 属性
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
节点ID#region 节点ID
        
private string _FunctionID;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 节点ID
        
/// </summary>

        [ColumnID(1000010)]
        
public string FunctionID
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _FunctionID; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _FunctionID = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
权限标志#region 权限标志
        
private string _PowerMark;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 权限标志
        
/// </summary>

        [ColumnID(1000050)]
        
public string PowerMark
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _PowerMark; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _PowerMark = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
父节点ID#region 父节点ID
        
private string _ParentID;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 父节点ID
        
/// </summary>

        [ColumnID(1000020)]
        
public string ParentID
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _ParentID; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _ParentID = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
父节点路径#region 父节点路径
        
private string _ParentIDPath;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 父节点路径
        
/// </summary>

        [ColumnID(1000032)]
        
public string ParentIDPath
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _ParentIDPath; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _ParentIDPath = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
节点级数#region 节点级数
        
private string _NoteLevel;
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 节点级数
        
/// </summary>

        [ColumnID(1000060)]
        
public string NoteLevel
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _NoteLevel; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _NoteLevel = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
排序序号#region 排序序号
        
private string _Sort;
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 排序序号
        
/// </summary>

        [ColumnID(1000090)]
        
public string Sort
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _Sort; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _Sort = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
网址#region 网址
        
private string _WebURL;
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 网址
        
/// </summary>

        [ColumnID(1000100)]
        
public string WebURL
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _WebURL; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _WebURL = value; }
        }

        
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
目标#region 目标
        
private string _Target;

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 打开窗口的target
        
/// </summary>

        [ColumnID(1000110)]
        
public string Target
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _Target; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _Target = value; }
        }

        
#endregion


        
#endregion

}



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、 实体类的定义可以有代码生成器生成。(我的代码生成器暂时没有完成)

 

===============================

 

相关贴子:


 【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】

【自然框架】之鼠标点功能现(二):表单控件的“应用”—— 代码?只写需要的!

 

相关文章
|
3月前
|
存储 开发框架 前端开发
EAV模型(实体-属性-值)的设计和低代码的处理方案(3)-- 实体属性定义及前端列表展示和数据录入处理
EAV模型(实体-属性-值)的设计和低代码的处理方案(3)-- 实体属性定义及前端列表展示和数据录入处理
|
6月前
|
数据可视化 数据挖掘 API
5 款热门的表单设计器推荐
5 款热门的表单设计器推荐
|
UED 开发者
构建可访问的自定义表单控件
在现代Web应用程序中,表单是一个至关重要的组件。用户可以通过表单输入数据并与应用程序进行交互。为了提高用户体验,并让所有用户都能轻松地使用您的应用程序,构建可访问的自定义表单控件是非常重要的。
|
安全 数据安全/隐私保护 对象存储
表单的 9 种设计技巧【上】
表单是信息添加、录入的通用形式,合理的表单设计能减轻用户负担。这里码匠提供了一些表单设计的简单技巧。
737 0
表单的 9 种设计技巧【上】
|
存储 前端开发 数据可视化
实现一个表单设计器我们需要知道的
表单功能一直是前端项目中比不可少的一块功能,如果有个项目需要在两个月内开发200个左右表单,那我们应该怎么办?加班加点也是能搞出来的,那质量有保证么,这是我们就需要开发一个可以通过可视化交互设计表单的功能。下面和大家分享下我在开发这款表单设计器时使用的技术能力以及整个的设计思路。
|
安全 数据库 数据安全/隐私保护
表单的 9 种设计技巧【下】
表单是信息添加、录入的通用形式,合理的表单设计能减轻用户负担。这里码匠提供的一些表单设计的简单技巧的下篇。
212 0
表单的 9 种设计技巧【下】
|
移动开发 前端开发 HTML5
前端表单部分新属性
前端表单部分新属性
97 0
|
XML 数据格式
自定义表单 动态表单 表单设计器 流程引擎 设计方案
自定义表单 动态表单 表单设计器 流程引擎 设计方案
550 0
|
测试技术
表单控件续(1)——应用接口来简化和分散代码
上次有点仓促,有几个地方没有明确。 1、两篇随笔可以合在一起看 能自己“跑”的表单控件,思路,雏形,源码。vs2005版本 我写项目的步骤。抛砖引玉。   后者是整个流程,前者是其中的一个步骤,是一个简单的思路说明,其中前三段代码都是表单控件里面的。
912 0
下一篇
无影云桌面