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

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

必填验证同理。

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

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

    /// <summary>
/// 验证类型
/// </summary>
public enum ValidateTypeEnum
{
/// <summary>
/// 无
/// </summary>
[Description("无")]
No = , /// <summary>
/// Eamil
/// </summary>
[Description("邮箱")]
email = ,
/// <summary>
/// URL
/// </summary>
[Description("网址")]
url = , /// <summary>
/// 整型
/// </summary>
[Description("整型")]
intNum = , /// <summary>
/// 浮点型
/// </summary>
[Description("浮点型")]
floatNum = , /// <summary>
/// 手机号码
/// </summary>
[Description("手机")]
mobile = , /// <summary>
/// QQ
/// </summary>
[Description("QQ")]
qq = , /// <summary>
/// 邮政编码
/// </summary>
[Description("邮政编码")]
zip = ,
/// <summary>
/// 电话号码
/// </summary>
[Description("电话")]
phone = , /// <summary>
/// 传真
/// </summary>
[Description("传真")]
faxno = , /// <summary>
/// 身份证
/// </summary>
[Description("身份证")]
idCard =
}

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

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

表单验证代码如下:

        /// <summary>
/// 表单字段配置验证
/// </summary>
/// <param name="moduleId">模块Id</param>
/// <param name="model">实体对象</param>
/// <param name="verifyFields">需要验证字段的字段集合</param>
/// <returns></returns>
public static string FormFieldVerify(Guid moduleId, object model, List<string> verifyFields)
{
Type modelType = GetModelType(moduleId);
PropertyInfo idProperty = modelType.GetProperty("Id");
Guid id = idProperty.GetValue(model, null).ObjToGuid(); //当前记录Id
//表单字段验证
if (verifyFields != null && verifyFields.Count > )
{
foreach (string field in verifyFields)
{
PropertyInfo p = modelType.GetProperty(field);
if (p == null) continue;
object value = p.GetValue(model, null);
Sys_FormField formField = SystemOperate.GetDefaultFormSingleField(moduleId, field);
if (formField == null) continue;
string fieldDisplay = SystemOperate.GetFieldDisplay(moduleId, field);
#region 必填验证
if (formField.IsRequired.HasValue && formField.IsRequired.Value) //必填验证
{
ControlTypeEnum crlType = formField.ControlTypeOfEnum;
string requiredDes = crlType == ControlTypeEnum.ComboBox ||
crlType == ControlTypeEnum.ComboGrid ||
crlType == ControlTypeEnum.ComboTree ?
"请选择" : "不能为空";
bool isForeignField = SystemOperate.IsForeignField(moduleId, field); //是否是外键字段
if (value == null || (isForeignField && value.ObjToGuid() == Guid.Empty))
{
return string.Format("【{0}】为必填字段,{1}!", fieldDisplay, requiredDes);
}
}
if (formField.ControlTypeOfEnum == ControlTypeEnum.IntegerBox ||
formField.ControlTypeOfEnum == ControlTypeEnum.NumberBox) //最大值、最小值验证
{
if (formField.MinValue.HasValue && value.ObjToDecimal() < formField.MinValue.Value ||
formField.MaxValue.HasValue && value.ObjToDecimal() > formField.MaxValue.Value)
{
return string.Format("【{0}】的值介于【{1}】~【{2}】之间!", fieldDisplay, formField.MinValue.Value, formField.MaxValue.Value);
}
}
if (p.PropertyType == typeof(String) && ((formField.MinCharLen.HasValue && formField.MinCharLen.Value > ) || (formField.MaxCharLen.HasValue && formField.MaxCharLen.Value > ))) //字符长度验证
{
if (value.ObjToStr().Length < formField.MinCharLen.Value ||
value.ObjToStr().Length > formField.MaxCharLen.Value)
{
return string.Format("【{0}】字符长度在【{1}】~【{2}】之间!", fieldDisplay, formField.MinCharLen.Value, formField.MaxCharLen.Value);
}
}
#endregion
#region 基本验证
if (formField.ValidateTypeOfEnum != ValidateTypeEnum.No && p.PropertyType == typeof(String))
{
//基本验证
switch (formField.ValidateTypeOfEnum)
{
case ValidateTypeEnum.email:
{
bool rs = Validator.IsEmail(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的邮箱地址!", fieldDisplay);
}
break;
case ValidateTypeEnum.idCard: //身份证验证
{
bool rs = Validator.IsIDCard(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的身份证号码!", fieldDisplay);
}
break;
case ValidateTypeEnum.intNum:
{
bool rs = Validator.IsInteger(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,只能输入整数值!", fieldDisplay);
}
break;
case ValidateTypeEnum.floatNum:
{
bool rs = Validator.IsNumber(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,只能输入数值!", fieldDisplay);
}
break;
case ValidateTypeEnum.faxno:
case ValidateTypeEnum.phone:
{
bool rs = Validator.IsTelePhoneNumber(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的固定电话号码!", fieldDisplay);
}
break;
case ValidateTypeEnum.mobile:
{
bool rs = Validator.IsMobilePhoneNumber(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的手机号码!", fieldDisplay);
}
break;
case ValidateTypeEnum.qq:
{
bool rs = Validator.IsIntegerPositive(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的QQ号码!", fieldDisplay);
}
break;
case ValidateTypeEnum.url:
{
bool rs = Validator.IsURL(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的URL!", fieldDisplay);
}
break;
case ValidateTypeEnum.zip:
{
bool rs = Validator.IsZipCode(value.ObjToStr());
if (!rs) return string.Format("【{0}】字段值无效,请输入正确的邮编!", fieldDisplay);
}
break;
}
}
#endregion
#region 字段唯一性验证
if (formField.IsUnique.HasValue && formField.IsUnique.Value) //唯一性验证
{
List<ConditionItem> conditonItems = new List<ConditionItem>() { new ConditionItem() { Field = field, Method = QueryMethod.Equal, Value = value } };
if (id != Guid.Empty) //编辑时排除当前记录
{
conditonItems.Add(new ConditionItem() { Field = "Id", Method = QueryMethod.NotEqual, Value = id });
}
object exp = GetQueryCondition(moduleId, conditonItems);
string errMsg = string.Empty;
object tempModel = GetEntity(moduleId, exp, null, out errMsg);
if (tempModel != null)
{
return string.Format("【{0}】=【{1}】的记录已存在,请不要重复添加!", fieldDisplay, SystemOperate.GetFieldDisplayValue(moduleId, model, formField));
}
}
#endregion
}
}
return string.Empty;
}

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

/// <summary>
/// 操作处理接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IModelOperateHandle<T> where T : class
{/// <summary>
/// 单个实体操作前验证或处理,针对新增保存前、删除前、修改保存前
/// </summary>
/// <param name="operateType">操作类型</param>
/// <param name="t">操作对象</param>
/// <param name="errMsg">错误信息</param>
/// <param name="otherParams">其他参数</param>
/// <returns>是否通过验证</returns>
bool BeforeOperateVerifyOrHandle(ModelRecordOperateType operateType, T t, out string errMsg, object[] otherParams = null);
/// <summary>
/// 多个实体操作前验证或处理,针对新增保存前、删除前、修改保存前
/// </summary>
/// <param name="operateType">操作类型</param>
/// <param name="ts">操作对象集合</param>
/// <param name="errMsg">错误信息</param>
/// <param name="otherParams">其他参数</param>
/// <returns>是否通过验证</returns>
bool BeforeOperateVerifyOrHandles(ModelRecordOperateType operateType, List<T> ts, out string errMsg, object[] otherParams = null); #endregion
}

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

    class Bpm_WorkFlowOperateHandle : IModelOperateHandle<Bpm_WorkFlow>
{/// <summary>
/// 操作前验证,如果流程已经在运行则不能删除
/// </summary>
/// <param name="operateType"></param>
/// <param name="t"></param>
/// <param name="errMsg"></param>
/// <param name="otherParams"></param>
/// <returns></returns>
public bool BeforeOperateVerifyOrHandle(ModelRecordOperateType operateType, Bpm_WorkFlow t, out string errMsg, object[] otherParams = null)
{
errMsg = string.Empty;
if (operateType == ModelRecordOperateType.Del)
{
//如果该流程存在流程实例则不允许删除
Bpm_WorkFlowInstance workflowInst = CommonOperate.GetEntity<Bpm_WorkFlowInstance>(x => x.Bpm_WorkFlowId == t.Id, null, out errMsg);
if (workflowInst != null)
{
errMsg = "运行中的流程不允许删除!";
return false;
}
}
return true;
}
/// <summary>
/// 操作前验证
/// </summary>
/// <param name="operateType"></param>
/// <param name="ts"></param>
/// <param name="errMsg"></param>
/// <param name="otherParams"></param>
/// <returns></returns>
public bool BeforeOperateVerifyOrHandles(ModelRecordOperateType operateType, List<Bpm_WorkFlow> ts, out string errMsg, object[] otherParams = null)
{
errMsg = string.Empty;
if (operateType == ModelRecordOperateType.Del)
{
foreach (Bpm_WorkFlow t in ts)
{
//如果该流程存在流程实例则不允许删除
Bpm_WorkFlowInstance workflowInst = CommonOperate.GetEntity<Bpm_WorkFlowInstance>(x => x.Bpm_WorkFlowId == t.Id, null, out errMsg);
if (workflowInst != null)
{
errMsg += string.Format("【{0}】,", t.Name);
}
}
if (errMsg.Length > )
{
errMsg = string.Format("流程{0}正在运行不允许删除!", errMsg);
return false;
}
}
return true;
}
}

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. python反射,单例模式

    # getattr# hasattr# setattr# delattr class Foo: def __init__(self, name,age): self.name = name self. ...

  2. linux缓存手动清理

    一般情况下不建议这么做, 如果你确定向的话还是可以的首先运行sync把未存盘的cache都写入磁盘,稍等片刻, 或者是直接运行sync 两遍 然后echo  1  试试应该大部分缓存可以释放 释放ca ...

  3. 数据结构编程实验——chapter10-应用经典二叉树编程

    二叉树不仅结构简单.节省内存,更重要是是这种结构有利于对数据的二分处理.之前我们提过,在二叉树的基础上能够派生很多经典的数据结构,也是下面我们将进行讨论的知识点: (1)   提高数据查找效率的二叉排 ...

  4. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  5. 穷竭搜索:POJ 3187 Backward Digit Sums

    题目:http://poj.org/problem?id=3187 题意: 像这样,输入N : 表示层数,输入over表示最后一层的数字,然后这是一个杨辉三角,根据这个公式,由最后一层的数,推出第一行 ...

  6. android 低功耗蓝牙使用

    参考链接:http://blog.csdn.net/xubin341719/article/details/38584469 1.android 手机的低功耗蓝牙,又称BLE :BLE在andriod ...

  7. git fatal: The remote end hung up unexpectedly 错误

    使用git将本地项目添加到远程仓库报以下错误 $ git push -u origin master fatal: The remote end hung up unexpectedly | 11.0 ...

  8. Spark MLlib使用有感

    这些天在公司里面做文本分析的任务,我跟着玻哥一起做,先研究了算法的可行度,最后决定使用Google的Word2Vector和LDA算法来对文本进行分析.之前因为看过一些Spark的东西,所以准备瞄准M ...

  9. tmux终端工具

    本文原始地址:http://www.cnblogs.com/chinas/p/7094172.html,转载请注明出处,谢谢!!! 1.介绍 tmux(终端复用工具):一个很有趣的工具,类似GNU S ...

  10. Python练习-sys.argv的无聊用法

    代码如下: # 编辑者:闫龙 #将三次登陆锁定的作业改为: # python login.py -u alex -p 123456 输入的形式 # (-u,-p是固定的,分别代表用户名和密码) imp ...