昨天给大家介绍了实体FluentValidation验证,今天继续给大家介绍表单验证,在Rookey.Frame框架中,表单验证有PrimaryKeyFields字段验证、唯一验证、必填验证、常用验证及自定义验证,PrimaryKeyFields字段验证昨天也略微介绍了下PrimaryKeyFields对记录唯一性进行验证,也即是由定义的一个或多个字段唯一确定一条记录,保存时不允许重复,根据定义的,就是在实体表定义时在[ModuleConfig]实体类属性标记中定义,也可以在模块管理界面修改

针对唯一性验证,可以在实体类属性字段标记[FieldConfig(IsUnique = true, IsRequired = true)]中定义,也可以在表单管理中修改

必填验证同理。

针对常用验证功能只能在表单中配置,打开表单管理在表单字段中修改验证类型:

目前支持的常用验证类型见如下枚举定义:

  1. /// <summary>
  2. /// 验证类型
  3. /// </summary>
  4. public enum ValidateTypeEnum
  5. {
  6. /// <summary>
  7. /// 无
  8. /// </summary>
  9. [Description("无")]
  10. No = ,
  11.  
  12. /// <summary>
  13. /// Eamil
  14. /// </summary>
  15. [Description("邮箱")]
  16. email = ,
  17. /// <summary>
  18. /// URL
  19. /// </summary>
  20. [Description("网址")]
  21. url = ,
  22.  
  23. /// <summary>
  24. /// 整型
  25. /// </summary>
  26. [Description("整型")]
  27. intNum = ,
  28.  
  29. /// <summary>
  30. /// 浮点型
  31. /// </summary>
  32. [Description("浮点型")]
  33. floatNum = ,
  34.  
  35. /// <summary>
  36. /// 手机号码
  37. /// </summary>
  38. [Description("手机")]
  39. mobile = ,
  40.  
  41. /// <summary>
  42. /// QQ
  43. /// </summary>
  44. [Description("QQ")]
  45. qq = ,
  46.  
  47. /// <summary>
  48. /// 邮政编码
  49. /// </summary>
  50. [Description("邮政编码")]
  51. zip = ,
  52. /// <summary>
  53. /// 电话号码
  54. /// </summary>
  55. [Description("电话")]
  56. phone = ,
  57.  
  58. /// <summary>
  59. /// 传真
  60. /// </summary>
  61. [Description("传真")]
  62. faxno = ,
  63.  
  64. /// <summary>
  65. /// 身份证
  66. /// </summary>
  67. [Description("身份证")]
  68. idCard =
  69. }

针对自身项目需要也可以将其他验证添加到其中

另外表单验证中针对数值型还可以设置最大最小值验证,针对字段串字段可以设置最大最小字符长度验证,同样在在表单字段中设置

表单验证代码如下:

  1. /// <summary>
  2. /// 表单字段配置验证
  3. /// </summary>
  4. /// <param name="moduleId">模块Id</param>
  5. /// <param name="model">实体对象</param>
  6. /// <param name="verifyFields">需要验证字段的字段集合</param>
  7. /// <returns></returns>
  8. public static string FormFieldVerify(Guid moduleId, object model, List<string> verifyFields)
  9. {
  10. Type modelType = GetModelType(moduleId);
  11. PropertyInfo idProperty = modelType.GetProperty("Id");
  12. Guid id = idProperty.GetValue(model, null).ObjToGuid(); //当前记录Id
  13. //表单字段验证
  14. if (verifyFields != null && verifyFields.Count > )
  15. {
  16. foreach (string field in verifyFields)
  17. {
  18. PropertyInfo p = modelType.GetProperty(field);
  19. if (p == null) continue;
  20. object value = p.GetValue(model, null);
  21. Sys_FormField formField = SystemOperate.GetDefaultFormSingleField(moduleId, field);
  22. if (formField == null) continue;
  23. string fieldDisplay = SystemOperate.GetFieldDisplay(moduleId, field);
  24. #region 必填验证
  25. if (formField.IsRequired.HasValue && formField.IsRequired.Value) //必填验证
  26. {
  27. ControlTypeEnum crlType = formField.ControlTypeOfEnum;
  28. string requiredDes = crlType == ControlTypeEnum.ComboBox ||
  29. crlType == ControlTypeEnum.ComboGrid ||
  30. crlType == ControlTypeEnum.ComboTree ?
  31. "请选择" : "不能为空";
  32. bool isForeignField = SystemOperate.IsForeignField(moduleId, field); //是否是外键字段
  33. if (value == null || (isForeignField && value.ObjToGuid() == Guid.Empty))
  34. {
  35. return string.Format("【{0}】为必填字段,{1}!", fieldDisplay, requiredDes);
  36. }
  37. }
  38. if (formField.ControlTypeOfEnum == ControlTypeEnum.IntegerBox ||
  39. formField.ControlTypeOfEnum == ControlTypeEnum.NumberBox) //最大值、最小值验证
  40. {
  41. if (formField.MinValue.HasValue && value.ObjToDecimal() < formField.MinValue.Value ||
  42. formField.MaxValue.HasValue && value.ObjToDecimal() > formField.MaxValue.Value)
  43. {
  44. return string.Format("【{0}】的值介于【{1}】~【{2}】之间!", fieldDisplay, formField.MinValue.Value, formField.MaxValue.Value);
  45. }
  46. }
  47. if (p.PropertyType == typeof(String) && ((formField.MinCharLen.HasValue && formField.MinCharLen.Value > ) || (formField.MaxCharLen.HasValue && formField.MaxCharLen.Value > ))) //字符长度验证
  48. {
  49. if (value.ObjToStr().Length < formField.MinCharLen.Value ||
  50. value.ObjToStr().Length > formField.MaxCharLen.Value)
  51. {
  52. return string.Format("【{0}】字符长度在【{1}】~【{2}】之间!", fieldDisplay, formField.MinCharLen.Value, formField.MaxCharLen.Value);
  53. }
  54. }
  55. #endregion
  56. #region 基本验证
  57. if (formField.ValidateTypeOfEnum != ValidateTypeEnum.No && p.PropertyType == typeof(String))
  58. {
  59. //基本验证
  60. switch (formField.ValidateTypeOfEnum)
  61. {
  62. case ValidateTypeEnum.email:
  63. {
  64. bool rs = Validator.IsEmail(value.ObjToStr());
  65. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的邮箱地址!", fieldDisplay);
  66. }
  67. break;
  68. case ValidateTypeEnum.idCard: //身份证验证
  69. {
  70. bool rs = Validator.IsIDCard(value.ObjToStr());
  71. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的身份证号码!", fieldDisplay);
  72. }
  73. break;
  74. case ValidateTypeEnum.intNum:
  75. {
  76. bool rs = Validator.IsInteger(value.ObjToStr());
  77. if (!rs) return string.Format("【{0}】字段值无效,只能输入整数值!", fieldDisplay);
  78. }
  79. break;
  80. case ValidateTypeEnum.floatNum:
  81. {
  82. bool rs = Validator.IsNumber(value.ObjToStr());
  83. if (!rs) return string.Format("【{0}】字段值无效,只能输入数值!", fieldDisplay);
  84. }
  85. break;
  86. case ValidateTypeEnum.faxno:
  87. case ValidateTypeEnum.phone:
  88. {
  89. bool rs = Validator.IsTelePhoneNumber(value.ObjToStr());
  90. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的固定电话号码!", fieldDisplay);
  91. }
  92. break;
  93. case ValidateTypeEnum.mobile:
  94. {
  95. bool rs = Validator.IsMobilePhoneNumber(value.ObjToStr());
  96. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的手机号码!", fieldDisplay);
  97. }
  98. break;
  99. case ValidateTypeEnum.qq:
  100. {
  101. bool rs = Validator.IsIntegerPositive(value.ObjToStr());
  102. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的QQ号码!", fieldDisplay);
  103. }
  104. break;
  105. case ValidateTypeEnum.url:
  106. {
  107. bool rs = Validator.IsURL(value.ObjToStr());
  108. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的URL!", fieldDisplay);
  109. }
  110. break;
  111. case ValidateTypeEnum.zip:
  112. {
  113. bool rs = Validator.IsZipCode(value.ObjToStr());
  114. if (!rs) return string.Format("【{0}】字段值无效,请输入正确的邮编!", fieldDisplay);
  115. }
  116. break;
  117. }
  118. }
  119. #endregion
  120. #region 字段唯一性验证
  121. if (formField.IsUnique.HasValue && formField.IsUnique.Value) //唯一性验证
  122. {
  123. List<ConditionItem> conditonItems = new List<ConditionItem>() { new ConditionItem() { Field = field, Method = QueryMethod.Equal, Value = value } };
  124. if (id != Guid.Empty) //编辑时排除当前记录
  125. {
  126. conditonItems.Add(new ConditionItem() { Field = "Id", Method = QueryMethod.NotEqual, Value = id });
  127. }
  128. object exp = GetQueryCondition(moduleId, conditonItems);
  129. string errMsg = string.Empty;
  130. object tempModel = GetEntity(moduleId, exp, null, out errMsg);
  131. if (tempModel != null)
  132. {
  133. return string.Format("【{0}】=【{1}】的记录已存在,请不要重复添加!", fieldDisplay, SystemOperate.GetFieldDisplayValue(moduleId, model, formField));
  134. }
  135. }
  136. #endregion
  137. }
  138. }
  139. return string.Empty;
  140. }

针对自定义验证,框架提供了验证接口

  1. /// <summary>
  2. /// 操作处理接口
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. public interface IModelOperateHandle<T> where T : class
  6. {/// <summary>
  7. /// 单个实体操作前验证或处理,针对新增保存前、删除前、修改保存前
  8. /// </summary>
  9. /// <param name="operateType">操作类型</param>
  10. /// <param name="t">操作对象</param>
  11. /// <param name="errMsg">错误信息</param>
  12. /// <param name="otherParams">其他参数</param>
  13. /// <returns>是否通过验证</returns>
  14. bool BeforeOperateVerifyOrHandle(ModelRecordOperateType operateType, T t, out string errMsg, object[] otherParams = null);
    /// <summary>
  15. /// 多个实体操作前验证或处理,针对新增保存前、删除前、修改保存前
  16. /// </summary>
  17. /// <param name="operateType">操作类型</param>
  18. /// <param name="ts">操作对象集合</param>
  19. /// <param name="errMsg">错误信息</param>
  20. /// <param name="otherParams">其他参数</param>
  21. /// <returns>是否通过验证</returns>
  22. bool BeforeOperateVerifyOrHandles(ModelRecordOperateType operateType, List<T> ts, out string errMsg, object[] otherParams = null);
  23.  
  24. #endregion
  25. }

例如针对工作流程删除验证:

  1. class Bpm_WorkFlowOperateHandle : IModelOperateHandle<Bpm_WorkFlow>
  2. {/// <summary>
  3. /// 操作前验证,如果流程已经在运行则不能删除
  4. /// </summary>
  5. /// <param name="operateType"></param>
  6. /// <param name="t"></param>
  7. /// <param name="errMsg"></param>
  8. /// <param name="otherParams"></param>
  9. /// <returns></returns>
  10. public bool BeforeOperateVerifyOrHandle(ModelRecordOperateType operateType, Bpm_WorkFlow t, out string errMsg, object[] otherParams = null)
  11. {
  12. errMsg = string.Empty;
  13. if (operateType == ModelRecordOperateType.Del)
  14. {
  15. //如果该流程存在流程实例则不允许删除
  16. Bpm_WorkFlowInstance workflowInst = CommonOperate.GetEntity<Bpm_WorkFlowInstance>(x => x.Bpm_WorkFlowId == t.Id, null, out errMsg);
  17. if (workflowInst != null)
  18. {
  19. errMsg = "运行中的流程不允许删除!";
  20. return false;
  21. }
  22. }
  23. return true;
  24. }
  25. /// <summary>
  26. /// 操作前验证
  27. /// </summary>
  28. /// <param name="operateType"></param>
  29. /// <param name="ts"></param>
  30. /// <param name="errMsg"></param>
  31. /// <param name="otherParams"></param>
  32. /// <returns></returns>
  33. public bool BeforeOperateVerifyOrHandles(ModelRecordOperateType operateType, List<Bpm_WorkFlow> ts, out string errMsg, object[] otherParams = null)
  34. {
  35. errMsg = string.Empty;
  36. if (operateType == ModelRecordOperateType.Del)
  37. {
  38. foreach (Bpm_WorkFlow t in ts)
  39. {
  40. //如果该流程存在流程实例则不允许删除
  41. Bpm_WorkFlowInstance workflowInst = CommonOperate.GetEntity<Bpm_WorkFlowInstance>(x => x.Bpm_WorkFlowId == t.Id, null, out errMsg);
  42. if (workflowInst != null)
  43. {
  44. errMsg += string.Format("【{0}】,", t.Name);
  45. }
  46. }
  47. if (errMsg.Length > )
  48. {
  49. errMsg = string.Format("流程{0}正在运行不允许删除!", errMsg);
  50. return false;
  51. }
  52. }
  53. return true;
  54. }
  55. }

OK,由于时间有限今天Rookey.Frame框架验证功能就介绍到此地,祝大家生活愉快!

Rookey.Frame之实体表单验证的更多相关文章

  1. 示例:WPF开发的简单ObjectProperyForm用来绑定实体表单

    原文:示例:WPF开发的简单ObjectProperyForm用来绑定实体表单 一.目的:自定义控件,用来直接绑定实体数据,简化开发周期 二.实现: 1.绑定实体对象 2.通过特性显示属性名称 3.通 ...

  2. 从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本文是介绍两个最常用的jQuery插件. 分别用 ...

  3. Rookey.Frame之实体FluentValidation验证

    昨天给大家介绍了Rookey.Frame框架的实体设计,今天继续跟大家分享实体的FluentValidation验证,在Rookey.Frame框架中可以设置多种验证方式:FluentValidati ...

  4. vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交

    vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象 ...

  5. Rookey.Frame企业级极速开发框架

    项目详细介绍 Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性 ...

  6. Rookey.Frame v1.0快速开发平台-整体介绍

    Rookey.Frame v1.0是一套基于.NET MVC的极速开发框架,支持简单逻辑模块零代码编程.支持二次开发,具有高扩展性.高复用性.高伸缩性. 框架特点 (1)简单逻辑模块实现零代码编程,通 ...

  7. Rookey.Frame企业级快速开发框架开源了

    Rookey.Frame是一套基于.NET MVC + easyui的企业级极速开发框架,支持简单逻辑模块零代码编程.支持工作流(BPM).支持二次开发,具有高扩展性.高复用性.高伸缩性:应广大网友要 ...

  8. Rookey.Frame v1.0极速开发平台稳定版发布

    Rookey.Frame v1.0经过一年时间的修改及沉淀,稳定版终于问世了,此版本经过上线系统验证,各个功能点都经过终端用户验证并持续优化,主要优化以下几个方面: 1.性能较原来提升3倍之多 2.修 ...

  9. Rookey.Frame之DAL工厂

    昨天给大家介绍了表单验证功能,今天给大家介绍下Rookey.Frame框架的数据层工厂,由于Rookey.Frame框架ORM是基于servicestack.ormlite,很多朋友反映这个网上中文资 ...

随机推荐

  1. [Spark]-Spark发展历程与基本概念

    Hadoop十年 找了一张Hadoop十年的生态发展图: Spark概况: Apache Spark是一个开源簇运算框架,最初是由加州大学柏克莱分校AMPLab所开发.相对于Hadoop的MapRed ...

  2. springboot 日期转化报错

    问题场景: 使用Springboot框架搭建服务,传日期参数json参数为2016-08-15 17:00:00这种格式,springboot中不能识别,将其转化为对象对应的日期属性.而是抛出异常信息 ...

  3. 用js获取客户端IP地址

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type=& ...

  4. Linux入门,这七大习惯得有!

    对于很多Linux初学者来说,在刚开始使用Linux系统时会感到很多不适.这里为大家整理了自己以前Linux入门时别人告诉我的七个习惯.我相信如果你运用了这七个习惯,在你使用Linux时你会感觉更安全 ...

  5. UC手机浏览器(U3内核)相关文档整理

    Note:绝大多数API在IOS版下不支持,使用前请自行测试. UC官方的开发者中心:http://www.uc.cn/business/developer.shtml U3内核定制<meta& ...

  6. 58、synchronized同步方法

    线程安全问题 先看下面代码出现的问题: 定义一个Task类,里面有一个成员变量和一个有boolean类型参数的方法,方法内部会根据传入参数修改成员变量的值. package com.sutaoyu.T ...

  7. 使用TS+Sequelize实现更简洁的CRUD

    如果是经常使用Node来做服务端开发的童鞋,肯定不可避免的会操作数据库,做一些增删改查(CRUD,Create Read Update Delete)的操作,如果是一些简单的操作,类似定时脚本什么的, ...

  8. macOS 安装 pcl 1.8.0

    Mac 上的 pcl 一直有问题. 找不到 pcl_viewer 查看 pcd 文件.写个程序用 pcl::visualization::CloudViewer 查看点云,遇到 Runtime Exc ...

  9. local variables referenced from a Lambda expression must be final or effectively final------理解

    前几天使用lamdba时,报了一个这个错,原因是在lamdba体中使用了一个变量,觉得很奇怪! 今天在读这本书的时候,又看到了这个解释,这里有了更深刻的理解,总结一下: 在jdk1.8之前在使用匿名内 ...

  10. 关于app的cpu占用率想到的几个问题

    1.top 命令获取的cpu是手机瞬间的cpu 2.dumpsys获取的是一段时间cpu的平均值?那么这段时间是指哪段,从哪开始到什么时候结束? 3.如果想测试app某操作下的cpu占用情况时候.应该 ...