Rookey.Frame之实体表单验证

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

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

   必填验证同理。

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

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

    /// <summary>
    /// 验证类型
    /// </summary>
    public enum ValidateTypeEnum
    {
        /// <summary>
        ////// </summary>
        [Description("")]
        No = 0,

        /// <summary>
        /// Eamil
        /// </summary>
        [Description("邮箱")]
        email = 1,
        /// <summary>
        /// URL
        /// </summary>
        [Description("网址")]
        url = 2,

        /// <summary>
        /// 整型
        /// </summary>
        [Description("整型")]
        intNum = 3,

        /// <summary>
        /// 浮点型
        /// </summary>
        [Description("浮点型")]
        floatNum = 4,

        /// <summary>
        /// 手机号码
        /// </summary>
        [Description("手机")]
        mobile = 5,

        /// <summary>
        /// QQ
        /// </summary>
        [Description("QQ")]
        qq = 6,

        /// <summary>
        /// 邮政编码
        /// </summary>
        [Description("邮政编码")]
        zip = 7,
        /// <summary>
        /// 电话号码
        /// </summary>
        [Description("电话")]
        phone = 8,

        /// <summary>
        /// 传真
        /// </summary>
        [Description("传真")]
        faxno = 9,

        /// <summary>
        /// 身份证
        /// </summary>
        [Description("身份证")]
        idCard = 10
    }

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

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

   表单验证代码如下:

        /// <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 > 0)
            {
                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 > 0) || (formField.MaxCharLen.HasValue && formField.MaxCharLen.Value > 0))) //字符长度验证
                    {
                        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 > 0)
                {
                    errMsg = string.Format("流程{0}正在运行不允许删除!", errMsg);
                    return false;
                }
            }
            return true;
        }
    }

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

posted on 2016-07-28 09:01  rookey  阅读(1243)  评论(0编辑  收藏  举报

导航