表单兼容类型设计

以前的我认为,相同的表单,若有后台代码,那么它对应的应该是一套业务,只能为这个功能服务。但是后来的需求打翻了我的认识。

以前我做的一条线是实现如下功能

这个是一条线的功能,结合工作流,4个活动点对应四个表单。

后来在做第四个功能线的时候发现一部分与功能一相同。但是其中用到的类与对象却不相同。但是页面是稍微变化。还是可以复用页面的。

需求功能大题是一样的。类的设计是不同的子类设计。那么就需要修改原来的代码实现了。

看设计图

先前所有后台的泛型为第一个,后续的复用页面需要用第二个泛型类,但是他们都共同继承同一个基类。如何根据不同的功能保存不同的泛型类。使一个表单兼容两个不同的类型,这是设计时需要考虑的。

我们的解决方式是在基类中添加了一个selfType的属性,标记了一个使用者的类型。这样在准备数据的时候传递的是基类,但是自身却携带了是某一个类型。

而到了具体的表单页面时,根据自身的selfType判断类型,继而转换不同的子类,保存数据。

我们来看看一个实例吧

设计的思路:

  • 首先加载基类,而后判断是否为空,若为空创建第子类的类型
  • 若不为空,根据父类携带类型,判断是子类的哪个类型,根据Id,加载子类,将父类指向子类
  • 表单根据父类携带的类型,保存时进行数据类型强转

Control准备数据

//以下为MVC中control中数据准备
	                   String resourceID = process.ResourceID;//父类加载数据,后续判断是否为空,指向不同自来
			EnsureKeyedCapabilityIndicatorFormBase data = EnsureKeyedCapabilityIndicatorFormBaseAdapter.Instance.Load(resourceID);
			int operateYear = WebUtility.GetRequestQueryValue("operateYear", DateTime.Now.SimulateTime().Year);

			if (data == null)
			{
				//父类为空,应用指向子类,创建子类对象,//方便后续转换类型
				data = new EnsureGroupKeyedCapabilityIndicatorForm()
				{
					SelfTypeName = typeof(EnsureGroupKeyedCapabilityIndicatorForm).Name,

					ID = resourceID,
					CreatorID = user.ID,
					CreatorName = user.DisplayName,
					CreateTime = DateTime.Now.SimulateTime(),
					OperateYear = operateYear,
					PlanStartYear = operateYear + 1,
					Subject = operateYear + "确认历史能力",
					ProcState = WfProcessStatus.NotRunning
				};
				var companyCapabilitySummary = data.InitDefaultCompanyCapability();
				CompanyCapabilitySummaryTransAdapter.Instance.Update(companyCapabilitySummary);
				EnsureGroupKeyedCapabilityIndicatorFormAdapter.Instance.Update((EnsureGroupKeyedCapabilityIndicatorForm)data);

			}
			else
			{
				//已经是有数据了,根据父类携带类型,判断是子类的哪个类型,进行类型加载
				if (data.SelfTypeName == typeof(EnsureGroupKeyedCapabilityIndicatorForm).Name)
				{
					data = EnsureGroupKeyedCapabilityIndicatorFormAdapter.Instance.Load(resourceID);
				}
				else
				{
					data = EnsureBusinessModelKeyedCapabilityIndicatorFormAdapter.Instance.Load(resourceID);
					var comanys = CompanyCapabilitySummaryTransAdapter.Instance.LoadByFormCode(resourceID);
					var enBusines = (EnsureBusinessModelKeyedCapabilityIndicatorForm)data;
					//子类还需要进行辨别是新增还是已经存在的商业模式,
					if (enBusines.BusinessModelExsitsType == BusinessModelExsitsTypeEnum.Exsits)
					{
						//已经在初始化自身
						if (comanys.Count == 0)
						{
							var companyCapabilitySummary = data.InitDefaultCompanyCapability();
							CompanyCapabilitySummaryTransAdapter.Instance.Update(companyCapabilitySummary);
						}

					}
					else
					{
						//新增,使用公共代替自身
						if (comanys.Count == 0)
						{
							var companyCapabilitySummary = data.InitDefaultCompanyCapability(CompanyCapabilitySummaryTrans.IndustryAvgCodeConst);
							CompanyCapabilitySummaryTransAdapter.Instance.Update(companyCapabilitySummary);
						}
					}

				}

			}
			//返回基类数据,但是指向的却是之类。
			return new FormCommandStateGenericBase<EnsureKeyedCapabilityIndicatorFormBase>()
			{
				Data = data
			};

表单后台保存

表单的继承类型为基类

 public partial class EnsureCapabilityIndicatorHistoryView : ExtendViewBase<FormCommandStateGenericBase<EnsureKeyedCapabilityIndicatorFormBase>, EnsureKeyedCapabilityIndicatorFormBase>
{
	//ViewData中DatA 为control中传递过来的数据(data)
	protected override void SaveApplicationData(WfExecutorDataContext datacontext)
			{
				//还是根据携带类型辨别是哪个继承类,
				if (this.ViewData.Data.SelfTypeName == typeof(EnsureGroupKeyedCapabilityIndicatorForm).Name)
				{
					//保存时进行数据类型强转(若没有control中的父类指向子类引用,这里的转换是报错的)
					EnsureGroupKeyedCapabilityIndicatorFormAdapter.Instance.Update((EnsureGroupKeyedCapabilityIndicatorForm)this.ViewData.Data);
				}
				else
				{
					EnsureBusinessModelKeyedCapabilityIndicatorFormAdapter.Instance.Update((EnsureBusinessModelKeyedCapabilityIndicatorForm)this.ViewData.Data);
				}
			}
}

小结:

这里用到的实质为面向对象中的继承特性,父类引用指向子类,这个相信大家很熟悉的,Ilist<string>
names= new List<string>()
实例化的是一个IList的父类,只能使用父类的属性,若想使用List的属性,如List的forEach属性,这样的实例化是不可以使用的,必须将names强转为List。就是一个很好的例子,但是若能透彻的明白,并在设计中熟练使用,还真的是需要透彻的了解,多多思考。

时间: 2024-11-08 18:59:14

表单兼容类型设计的相关文章

基于Extjs的web表单设计器 第二节——表单控件设计

这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基本元素,更是核心组成部门. 一.区域控件,它主要包含三个类型的控件:卡片区域.表格区域.混合区域.这三个控件是我们的其他控件的容器或者叫包装器,相当于VS里面的各种Panel.它们很重要,每种区域控件的作用都不一样,能够包含的控件类型也不大一样,它们三个区域相互配合使用,可以为我们的表单提供强大的支

将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)

表单序列化类型的数据是指url传递的数据的格式,形如"key=value&key=value&key=value"这样的key/value的键值对.一般来说使用jQuery的$.fn.serialize函数能达到这样的效果.如何将这样的格式转化为对象? 我们知道使用jQuery的$.fn.serializeArray函数得到的是一个如下结构的对象 [ { name: "startTime" value: "2015-12-02 00:00:

asp.net 微信企业号办公系统-表单及流程设计配置实例

在环境搭建好之后,我们就来学习一下怎样快速创建一个流程,并执行和流转该流程(我们这里讲的只是入门,不涉及到具体流程参数设置). 创建一个流程步骤为:在数据库在创建表-->设计表单-->设置流程-->配置菜单  即可点击新配置的菜单运行该流程. 1.创建业务数据表 根据自己的业务需求我们创建自己的业务表(例如政府部门常用的 文件阅办卡): 建表注意事项: 表必须要有一个主键,主键只能是int型的自增字段或者uniqueidentifier(guid)类型. 2.设计表单 打开表单设计器:

HTML超文本标记语言(九)——表单输入类型

1.<inpur type="text">:定义供文本输入的单行输入字段: 2.<input tyope="password">:定义密码字段.password字段中的字符会被做掩码处理(显示为星号或实心圆): 3.<input type="submit" value="submit">:定义提交按钮,将表单数据提交至表单处理程序.若省略value属性,按钮以中文"提交"

表单form类型数据转换为数组array

Http的请求类型: Content-Type: application/x-www-form-urlencoded 数据格式比如: mc_gross=399.00&protection_eligibility=Eligible&address_status=confirmed&payer_id=XEMQ4LGLL3E8U&address_street=%BF%C6%D4%B0%C2%B72%BA%C5A8%D2%F4%C0%D6%B4%F3%CF%C3&payme

表单验证的设计

不说废话,直接留干货.实现的效果:多条表单提交的时候,如果某个表单的输入不和格式要求,则提示对应的错误信息,所有表单的内容合适,则提交到后台.显示代码(这里的dom的结构不唯一,我只是在我实际的项目中,遇到的解决方案) dom: css: js: 显示的效果: 全部格式不对: 部分不对: 验证为空后继续验证是否符合电话格式(这里只做了这个具体的验证,也可以做邮箱的验证,就要单独写正则验证邮箱) 总结:这样做的好处就是,在提交表单的时候,如果某条表单格式不对,可以立马显示出对应表单,不用一条一条的

html5中哪些是不同的新的表单元素类型

新的input的类型有 email(自动验证email格式) url(自动验证url格式) number(只能输入数字) range(类似音量滑动条) Date pickers (date, month, week, time, datetime, datetime-local)(自带日期选择) search(搜索域,类似百度的类似搜索提示) color(颜色选择,这个现在不兼容大部分浏览器=-=) 新标签 datalist(自动验证内容是否在可选择选项中) keygen output (这俩我

form表单元素类型

1 <form> 2 <input type="text"> 3 <input type="password"> 4 <input type="hidden"> 5 <input type="radio" name="sex" value="男">男 6 <input type="radio" name

JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单 一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检查必填字段是否填写.填写格式是否符合要求等. 每个表单里面,当获取到输入焦点时,令提示文本消失 现在开始动手来写. 1.实现思路 (1)在这个表单里会验证的是必填字段和邮箱格式是否正确.首先,把判断必填字段和邮箱格式分别写在两个