.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的也写了一个 ...
随机推荐
- 天猫登录源码 POST C#
HttpHelper 请从网络中搜索: public partial class LoginTMall : Form { public LoginTMall() { InitializeCompone ...
- IBatis按条件分页查询
XML中代码 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC & ...
- HDU1671 字典树
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [IT新应用]家用NAS,自建“360云盘”
360云盘也快要离开了.同事中有人开始尝试使用群晖NAS.西数的NAS来自建云了. [功能对比] [选择参数] [口碑评价]
- [转]Linux学习笔记——例说makefile 头文件查找路径
0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...
- poj2488骑士马走
#include<stdio.h> #include<stdlib.h> int data[100][100] = {0}; int Dx[8] = {-1,1,-2,2,-2 ...
- mvc 3 Mvc 4 使用Forms 登录验证随笔一
前言 本人虽然做 .Net 也有五年有余,可是没什么大才,总是干些打杂的活,技术很少差劲呀.以前不管是做内部管理系统,还是企业平台,保存用户登录信息用的都是Session,也许是从一开始就接触Sess ...
- Unity WebGL MoonSharp崩溃问题
当前Unity的代码更新方案基本都选择的ULua,而我们项目还需要考虑Web平台,ULua不支持WebGL,所以决定选择MoonSharp.MoonSharp(http://www.moonsharp ...
- Chrome 控制台使用大全
Chrome的开发者工具已经强大到没朋友的地步了,特别是功能丰富界面友好的console 一.console.log 将输出到控制台的信息进行分类会更好: console.log(); 普通信息 ...
- django-- Models
数据库配置 django默认支持sqlite,MySQL,Oracle,postgresql数据库 如何将数据库设置为MySQL 将setting中的database修改: DATABASES = { ...