连载:(二)循序渐进,通过XML配置,实现通用于WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表单、报表--原理

连载:(二)循序渐进,通过XML配置,实现通用于WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表单、报表

--原理

作者:长江支流

本原理,适用于Window Form的CS,也适用于ASP.Net的BS。

在描述原理之前,先来看个传统的ORM写代码的例子。

实体映射

现在很多架构实现ORM,去动态的生成代码,实现数据增、删、改、查的功能。

实体的映射关系,是通过代码的方式进行映射的,是否可以通过XML文件,来配置实例的映射关系,答案是肯定的。

代码映射

这里,先看一下主键为ID的表test_EntityAccessORM有两个字段DM、MC表示代码、名称,表字段与实体的映射代码实现方式。

(注意:写代码不是我们本意,我们将要抛弃代码,程序员就是为了不写代码或少写代码!)

using System;
using WebMIS.Data.EntityAccess;
using WebMIS.Data.EntityAccess.MapAttribute;

namespace WebMIS.Data.EntityAccess.Test
{
	/// <summary>
	/// 实体映射。
	/// </summary>
	 //描述映射的表名,主键(主键可多个),如("myTable","ID,NO")或("myTable","ID","NO"),可写在类申明上,也可写在无参公有构造函数上,且类上优先。
	[WebMIS.Data.EntityAccess.MapAttribute.TableMap("test_EntityAccessORM","ID")]
	public class EntityMapByAuto:WebMIS.Data.EntityAccess.EntityAutoMap
	{
		private long _ID;			//ID
		private string _Code ;		//代码
		private string _Name ;		//名称

		//[WebMIS.Data.EntityAccess.MapAttribute.TableMap("test_EntityAccessORM","ID")]
		public EntityMapByAuto()
		{
		}

		[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("ID",System.Data.DbType.UInt32)]
		public long ID
		{
			get{return _ID;}
			set{_ID = value;}
		}

		[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("dm")]
		public string Code
		{
			get{return _Code;}
			set{_Code = value;}
		}

		[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap("mc")]
		public string Name
		{
			get{return _Name;}
			set{_Name = value;}
		}

		//以下公有字段或属性,没有ColumnMap ,不参预ORM
		public string abc="";
		public static string ABCD
		{
			get{return "ABCD1";}
		}
	}
}

由此可知,通过属性类WebMIS.Data.EntityAccess.MapAttribute.TableMap指定表及主键,通过WebMIS.Data.EntityAccess.MapAttribute.ColumnMap指定数据库表字段与属性的对应映射关系。大家从VS自带的实体框架EF中也可以找出类似的实现原理。

XML映射

我们这里要实现的,是通过XML配置文件,配置表字段与实体的映射关系,不写代码的实现方式。这样的好处时,只需要改配置文件,无需编译再发布部署程序,灵活方便。

这里,特别要注意的是,XML<Field>节点中<lD>表示WinForm/WebForm中控件的ID属性或标准html元素的name属性,<Name>表示Select中指定的字段名。

而且还要注意:<Field>定义,<lD>要与UI中控件或元素ID/Name属性相同(区分大小写)、<Name>是<Select>元素中写出的字段,区分大小写。

<?xml version="1.0" encoding="utf-8"?>
<WebMisControllerSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Controller>
    <!--注意,Select中的字段大小写,所以Field中的Name节点,要与之一样-->
    <Select>Select ID, DM,MC From test_EntityAccessORM</Select>
    <TableName>test_EntityAccessORM</TableName>
    <PrimaryKey>ID</PrimaryKey>
    <PrimaryKeyValue />
    <UpdateWhere />
    <DeleteWhere />
    <Fields>
      <Field>
        <!--ID节点表示WinForm/WebForm中控件的ID属性或标准html元素的name属性-->
        <ID>ID</ID>
        <!--Name节点表示Select中指定的字段名-->
        <Name>ID</Name>
        <Type />
        <Save>false</Save>
        <Visible>false</Visible>
      </Field>
      <Field>
        <ID>Code</ID>
        <Name>DM</Name>
        <Align>right</Align>
        <Width>30</Width>
        <Type />
        <Save>true</Save>
        <Title>代码</Title>
        <FormType />
        <Visible>true</Visible>
        <Null>false</Null>
        <NullTitle>代码不能为空,请输入!</NullTitle>
        <Sql />
        <Value />
        <Excel />
        <UserInputValue />
      </Field>
      <Field>
        <ID>Name</ID>
        <Name>MC</Name>
        <Title>名称</Title>
        <NullTitle>名称不能为空,请输入!</NullTitle>
      </Field>
    </Fields>
  </Controller>
</WebMisControllerSerializer>

运行原理

假设,在网格的某一行选择后点击编辑按钮或双击网格某一行,弹出一个显示编辑的UI界面(WinForm或Web网页,由使用者或UI设计师开发)。解析程序,会根据XML配置文件中的Select节点获取数据源,通过传递的主键值获取唯一记录,并将记录值根据XML配置的字段映射关系以及与UI中的映射关系,将读取的数据显示在UI中。

如果保存数据,首先判断设置的Null为false时表示不允许为空,根据NullTitle提示用户输入;然后判断如果设置了存在性检查,就会去执行指定的检查规则…;最后,获取字段值以存入数据库。值一般是通过UI元素控件输入,或可以从Excel单元格获取,也可以通过SQL获取,并且优先通过程序配置UserInputValue的键值对设置。

除此之外,系统还会根据一定规则,去读参数值,例如Asp.Net时取URL参数指定值、Session、Application值。

  • 控制文件

通过XML描述的控制文件叫控制文件,它可以描述模型定义、UI表单、交互回调函数、查询报表数据源、查询过滤条件字段等。

  • 模板文件

使用者自己定义UI界面的页面模板,叫做模板文件,用于输入或显示XML中指定数据源的数据。当然,如果不指定模板文件,可以根据XML控制文件,自动生成页面。

  • 解析器

通过XML描述的控制文件,由解析程序来处理并控制的,它会根据控制文件的模型描述,将数据库中数据显示在UI视图中或者将表单数据存储到数据库中。

在本连接下一章节,将用C#实现XML配置文件相关类,并给出源代码。

声明:本文版权为长江支流周方勇所有,如需转载,请保留完整的内容及出处。

作者:长江支流 [email protected] 微信:winxin8001234567

时间: 2025-01-16 03:00:56

连载:(二)循序渐进,通过XML配置,实现通用于WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表单、报表--原理的相关文章

连载:(一)循序渐进,通过XML配置,实现通用于WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表单、报表--前言

循序渐进,通过XML配置,实现通用于WinForm(.Net).WebForm(Asp.Net+JQuery+EasyUI)表单.报表 --前言 作者:长江支流 本连载,定义为<循序渐进,通过XML配置,实现通用于WinForm(.Net).WebForm(Asp.Net+JQuery+EasyUI)表单.报表>,通过大量篇幅进行详细的代码及文字说明,实战.Net开发.欢迎转载,转载请注明出处,谢谢! 十年前(2004年8月17日),在CSDN发表了两篇有关.Net环境下的打印相关的博文,之后

连载:(三)循序渐进,通过XML配置,实现通用于WinForm(.Net)、WebForm(Asp.Net+JQuery+EasyUI)表单、报表--控制文件

连载:(三)循序渐进,通过XML配置,实现通用于WinForm(.Net).WebForm(Asp.Net+JQuery+EasyUI)表单.报表 --XML控制文件 作者:长江支流 本章,将给出控制文件相关类的C#.Net源代码,包括控制文件主控类WebMisController.以及控制文件的组成部分表单及清单过滤字段Field类.回调函数类CallbackFun. 控制文件 控制文件由WebMIS.ServiceModel.WebMisController/ WebMisControlle

二、struts.xml配置及例程

1.配置文件的优先级 在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,struts.properties和web.xml文件中配置,它们的优先级逐步升高,即是说后面的配置会覆盖掉前面相同的配置. 2.配置形式 下面以对struts.i18n.encoding=UTF-8的配置为例进行说明: 在struts.xml配置形式如下: <constant name="struts.i

160329(二)、web.xml配置详解

1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对,并交给servletContext. 4.容器创建<listener>中的类实例,创建监听器. 二  Load-on-startup Load

Jquery ajax 表单验证处理返回的xml格式数据

jsp页面表单: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); Strin

用jquery获取表单元素(二)

获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").attr('checked')==true)  //判断是否已经打勾    --注:name即控件name属性,value即控件value属性 第二种: 可以不指定属性值,因一组checkbox的value值都会保存其在数据库中对应的id,最好写成如下方式: if($("input[name=row_checkbox]").attr

【struts2.5配置】web.xml配置

一.引用jar包 1. 将下载好的struts下的核心类库复制到/WEB-INF/lib目录下 二.web.xml配置 check your struts2-core-x.x.jar version. -->if it is struts2-core-2.5.jar then change your filter class tag value in web.xml to <filter-class> org.apache.struts2.dispatcher.filter.Struts

bootstrap学习起步篇:初识bootstrap之表单验证(二)

学习bootstrap是个过程,它提供给我们的文档上有很详细的说明.包括常用的栅栏布局.页面元素等,这里就不啰嗦了,今天,我就来说下结合jquery的表单验证. 最开始不借助插件,我们需要自己去编写验证规则.使用jquery验证,能让我们省去一些功夫. 首先我们需要引入js文件:jquery.validate.js:另外为了能使用它的样式,我们需另外引入screen.css.当然,如果要使用bootstrap,还是要引入其所需的文件的. 下面,我们需要一个表单: <form class="

Maven pom.xml 全配置(二)不常用配置

Maven pom.xml 全配置(二)不常用配置 这里贴出Maven pom.xml文件中使用率较少的配置参数,如果此篇文档中没有找到你想要的参数,移步Maven pom.xml 全配置(一)常用配置 <!-- 项目创建年份,4位数字.当产生版权信息时需要使用这个值. --> <inceptionYear /> <!-- 描述了这个项目构建环境中的前提条件. --> <prerequisites> <!-- 构建该项目或使用该插件所需要的Maven的