.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的也写了一个 ...
随机推荐
- Python3中使用PyMySQL连接Mysql
Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...
- 关于BeanUiles.copyPropertis()的用法
最近的项目遇到BeanUiles.copyPropertis(),大大的简化了代码量.用hibernate从数据库中映射的实体类,与pojo对象进行转换,传统做法 Object obj = baseD ...
- ThinkPHP 3.2.3 加减乘法验证码类
ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Ver ...
- [工具分享]JetBrains ReSharper 9.0 正式版和注册码
话不多说.直接上百度云盘分享链接.有需要的盆友去下载吧. 百度云盘:http://pan.baidu.com/s/1kTKIQhh 注册码这里提供一个.有需要的自己拿走.或者可以使用压缩包里面的key ...
- try{}、catch(){}、throw语句
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- JavaScript数据类型 typeof, null, 和 undefined
JavaScript 数据类型 在 JavaScript 中有 5 种不同的数据类型: string number boolean object function 3 种对象类型: Object Da ...
- css中很有用的属性
有些css属性很实用,但不常用也就被忘记. 这里纪录了自己在项目中用过的一些. html,body{ -webkit-tap-highlight-color:transparent; } 这个的用途是 ...
- 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案 本文是截止目前为止最强攻略,按照本文方法基本可以无压力应对caffe和Ross B. Girshick的 ...
- mui框架使用的过程中遇到的几个问题
1.zepto.js和mui一起使用的时候,tap事件会发生两次,这时只要不引用zepto.js的touch.js就可以了,只用mui的tap事件,如: mui(".infor_header ...
- ios上的 button和input-button为什么不水平居中的
在iphone6plus上的button中文本上不居中,如下图: 造成的原因,是button的padding不为零,造成的,因而设置padding: 0:就可以解决