.net之工作流工程展示及代码分享(一)工作流表单
Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写。
在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符号,如下图:
Form类如下:
public delegate string SetAutoCompleteValue(string autoCompleteType); [Serializable]
public class Form
{
[XmlAttribute]
public Guid FormId { get; set; }
[XmlAttribute]
public string FormName { get; set; }
[XmlAttribute]
public string FormCategory { get; set; }
[XmlAttribute]
public string FormContent { get; set; }
[XmlAttribute]
public DateTime CreateDate { get; set; }
public Person Creator { get; set; } public string CreaterName
{
get { return Creator != null ? Creator.PersonName : ""; }
} public List<FormControl> FormControls { get; set; } public void InitializeFormControls()
{
if (!string.IsNullOrEmpty(FormContent))
{
const string pattern = @"\<input(.*?)\/>";
var rx = new Regex(pattern);
var matches = rx.Matches(FormContent);
var formControls = new List<FormControl>();
foreach (Match match in matches)
{
string fieldLabel = Convert.ToString(match.Groups[]); //Group[0] :[xx],Group[1]: xx
string[] para = fieldLabel.Split(' '); var values = para.First(s => s.Trim().ToLower()
.StartsWith("value=")).Replace("value=", "").Replace("\"", ""); string[] sArray = Regex.Split(values, "//", RegexOptions.IgnoreCase); bool isNewControl = true;
string controlId = string.Empty;
if (para.Any(p => p.StartsWith("id=")))
{
isNewControl = false;
controlId = para.First(s => s.Trim().ToLower()
.StartsWith("id=")).Replace("id=", "").Replace("\"", "");
} if (sArray.Count() >= ) //每个输入框表单至少要有三个以上属性
{
FormControl formControl ;
if (isNewControl)
{
switch (sArray[])
{
case "单行":
formControl = new TextLineFormControl();
formControl.Width = int.Parse(sArray[]);
break;
case "多行":
formControl = new MultiLineFormControl();
formControl.Width = int.Parse(sArray[]);
formControl.Height = int.Parse(sArray[]);
break;
case "单选":
formControl = new RadioFormControl();
formControl.InitialData = sArray[];
break;
case "多选":
formControl = new CheckBoxFormControl();
formControl.InitialData = sArray[];
break;
case "下拉":
formControl = new DropDownFormControl();
formControl.InitialData = sArray[];
break;
case "自动":
formControl = new AutoCompleteFormControl();
formControl.InitialData = sArray[];
break;
default:
formControl = new UnknowFormControl();
break;
}
formControl.FieldName = sArray[];
formControl.ControlId = Guid.NewGuid(); }
else
{
formControl = FormControls.Single(f => f.ControlId == Guid.Parse(controlId));
switch (sArray[])
{
case "单行":
formControl.Width = int.Parse(sArray[]);
break;
case "多行":
formControl.Width = int.Parse(sArray[]);
formControl.Height = int.Parse(sArray[]);
break;
case "单选":
formControl.InitialData = sArray[];
break;
case "多选":
formControl.InitialData = sArray[];
break;
case "下拉":
formControl.InitialData = sArray[];
break;
case "自动":
formControl.InitialData = sArray[];
break;
default:
break;
}
} formControls.Add(formControl);
FormContent = FormContent.Replace(match.Value,
string.Format("{{{0}}}", formControl.ControlId));
} }
FormControls = formControls;
FormContent = FormContent;
}
} public string GetOccupyContentString()
{
var str = FormContent;
foreach (var formControl in FormControls)
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetDesignString());
}
return str;
} public string GetPreviewContentString()
{
var str = FormContent; foreach (var formControl in FormControls)
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString());
}
return str;
} public string GetPreviewContentString(Dictionary<Guid, string> writedValues)
{
var str = FormContent; foreach (var formControl in FormControls)
{
string value = null;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value);
}
else
{
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), string.Empty);
}
}
return str;
} public string GetDisplayContent(List<Guid> canWriteformControlIds, SetAutoCompleteValue autoCompleteValue, Dictionary<Guid, string> writedValues = null)
{
var str = FormContent; foreach (var formControl in FormControls)
{
if (canWriteformControlIds.Contains(formControl.ControlId))
{
string value = null;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
formControl.FieldValue = value;
}
if (string.IsNullOrEmpty(value) && formControl is AutoCompleteFormControl &&
!string.IsNullOrEmpty(formControl.InitialData) && autoCompleteValue != null)
{
formControl.FieldValue = autoCompleteValue(formControl.InitialData);
}
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), formControl.GetInputString());
}
else
{
string value = string.Empty;
if (writedValues != null && writedValues.TryGetValue(formControl.ControlId, out value))
{
formControl.FieldValue = value;
}
str = str.Replace(string.Format("{{{0}}}", formControl.ControlId), value);
}
}
return str;
}
}
[Serializable]标识是为了能序列化类;
[XmlAttribute]是为了在持久化保存到数据库的时候使用XML特性,节约保存控件,便于查询操作。
InitializeFormControls:从编辑器中读入的代码进行初始化;
其它的方法基本用于前台呈现。
FormControl类如下:
基类:
[Serializable]
[XmlInclude(typeof(TextLineFormControl))]
[XmlInclude(typeof(MultiLineFormControl))]
[XmlInclude(typeof(RadioFormControl))]
[XmlInclude(typeof(CheckBoxFormControl))]
[XmlInclude(typeof(DropDownFormControl))]
[XmlInclude(typeof(AutoCompleteFormControl))]
[XmlInclude(typeof(UnknowFormControl))]
public abstract class FormControl
{
[XmlAttribute]
public Guid ControlId { get; set; }
[XmlAttribute]
public string FieldName { get; set; }
[XmlAttribute]
public string FieldValue { get; set; }
[XmlAttribute]
public int Width { get; set; }
[XmlAttribute]
public int Height { get; set; }
[XmlAttribute]
public string ToolTip { get; set; }
[XmlAttribute]
public bool Required { get; set; }
[XmlAttribute]
public bool CanWrite { get; set; }
[XmlAttribute]
public string InitialData { get; set; }
public abstract string GetDesignString();
public abstract string GetInputString();
}
[XmlInclude(typeof(TextLineFormControl))]..... 为了持久化时能够将派生类兼容存储;
GetDesignString:在设计器里呈现的方式;
GetInputString:在让用户输入时呈现的代码。
几个派生类:
[Serializable]
public class TextLineFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.TextBoxFormControlName, FieldName, Width, WorkflowConstant.ControlDesignWidth,ControlId);
} public override string GetInputString()
{
return string.Format("<input type=\"text\" value=\"{0}\" id=\"{1}\" size=\"{2}\" maxlength=\"{2}\" name=\"{1}\" >",
FieldValue, ControlId, Width);
}
} [Serializable]
public class MultiLineFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}//{5}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.TextAreaFormControlName, FieldName, Width, WorkflowConstant.ControlDesignWidth, ControlId, Height);
} public override string GetInputString()
{
return string.Format("<textarea cols=\"{2}\" rows=\"{3}\" id=\"{1}\" name=\"{1}\" >{0}</textarea>",
FieldValue != null ? FieldValue.Replace("<br/>", "\n\r") : string.Empty, ControlId, Width, Height);
}
} [Serializable]
public class RadioFormControl : FormControl
{
public override string GetDesignString()
{
return string.Format("<input type=\"text\" value=\"{0}//{1}//{2}\" style=\"{3}\" id=\"{4}\">",
WorkflowConstant.RadioFormControlName, FieldName, InitialData, WorkflowConstant.ControlDesignWidth, ControlId);
} public override string GetInputString()
{
StringBuilder sb= new StringBuilder();
var data = InitialData.Split('|');
for (int i = ; i < data.Length; i ++)
{
sb.AppendFormat("<input type=\"radio\" name=\"{0}\" id=\"{0}-{1}\" value=\"{2}\" {3}/>", ControlId, i,
data[i], FieldValue == data[i] ? " checked=\"checked\"" : string.Empty);
sb.AppendFormat("<label for=\"{0}-{1}\">{2}</label>", ControlId, i, data[i]);
}
return sb.ToString();
}
}
.........
Form类使用InitializeFormControls方法生成各种实例化控件,放在FormControls字段里。
这两个类使用的基本上是领域模型。
本系列导航:
- .net之工作流工程展示及代码分享(预告)
- .net之工作流工程展示及代码分享(一)工作流表单
- .net之工作流工程展示及代码分享(二)工作流引擎
- .net之工作流工程展示及代码分享(三)数据存储引擎
- .net之工作流工程展示及代码分享(四)主控制类
- .net之工作流工程展示及代码分享(五)前端交互
.net之工作流工程展示及代码分享(一)工作流表单的更多相关文章
- .net之工作流工程展示及代码分享(四)主控制类
现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...
- .net之工作流工程展示及代码分享(三)数据存储引擎
数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...
- .net之工作流工程展示及代码分享(二)工作流引擎
在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: [Serializable] public class Flow { [Xml ...
- .net之工作流工程展示及代码分享(预告)
最近在帮公司做一个工作流程序模块,要求是可以嵌入到各种现有的程序中去.我想把自己制作的思路和过程同大家分享. 先上一张结构图: 由于该项目我一个人做,所以系统结构不能太复杂. 用到的技术主要有:DDD ...
- net之工作流工程展示及代码分享(记录)
http://www.cnblogs.com/thanks/p/4183235.html
- KindEditor设置为过滤模式,但在代码模式下提交表单时不过虑HTML标签的解决方法
KindEditor设置filterMode为true,但在代码模式下提交表单的话,发现并没有过虑掉自己不想保留的HTML标签. 这时只需同步内容前加上红色部分内容即可: onClick=" ...
- 一段神奇的代码,解决form表单背景偏黄问题
一段神奇的代码,解决form表框背景偏黄问题 最近在做项目时,发现自己做的挺好看的表单,背景变成了黄色,所以这次折腾了好久终于找到了符合我的决绝办法,现在来分享给大家 一般解决这种input表框偏黄问 ...
- 【代码笔记】Web-JavaScript-JavaScript表单验证
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 代码段:js表单提交检测
市面上当然有很多成型的框架,比如jquery的validation插件各种吧.现在工作地,由于前端童鞋也没用这些个插件.根据业务的要求,自己就在代码里写了个简单的表单提交的检测代码(php的也写了一个 ...
随机推荐
- HashSet
- java 编码
编码和解码:无论是解码还是编码都是针对码表来讲的. 编码:将能看懂得字符变为我们看不懂的码值. 字符串--->字节数组 String类的getBytes() 方法进行编码,将字符串,转为对映的二 ...
- phpcms无刷新分页
控制器添加一个函数: 添加一个静态页面ajax_message.html,在页面中添加如下代码: 在要分页的页面(我的是"show"页面)中添加如上图代码: phpcms无刷新分页 ...
- DevOps is dirty work - Dream in One-Click
真是一晃就到年底,年初许的梦想实现了吗?这么残忍的问题还是不要知道答案了吧:) 这恍若隔世的大半年,不仅没有承接着上篇继续聊Continuous Delivery (CD),反而疑似荒废.然而,梦想还 ...
- KITTI数据集格式说明
由于上一篇博客所提到的论文中的训练数据是KITTI的数据集,因此如果我想要用自己的数据集进行训练的话,就需要先弄清楚KITTI数据集的格式,在以下的网址找到了说明: 首先,数据描述中是这样的: 在以下 ...
- 【Android测试】Android截图的深水区
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/6113059.html 需求 这两天遇到这样一个事情,因为某 ...
- TCP3次握手连接协议和4次握手断开连接协议
TCP/IP 状态机,如下图所示: 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (SYN包表示标志位syn=1,ACK包表示标志位ack=1,SYN+A ...
- 原生js实现网页触屏滑动
前言: 我有一个html格式的2048游戏,可以用键盘上下左右操作,但是放到手机上就抓瞎了.于是想修改一下代码,将键盘事件改成手机触屏事件. html5 的touch事件 html5支持touch事件 ...
- [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速
搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...
- imx6 usb otg config 配置
imx6 usb的host和slave配置,配置之后,安装gadget模块,就能够在host和slave之间切换. 参考文档: i.MX 6Dual/6Quad Linux Reference Man ...