/* (模型验证提供者)模块说明 * 模型类 应当继承接口 IReadOnlyXXX 或 IReadOnlyNullableXXX * IXXX接口 不继承 IReadOnly 或 IReadOnlyNullable * 所以 应当 使用 IReadOnlyXXX 或 IReadOnlyNullableXXX * IXXX 实现 get, set 常用于表中的字段 * IReadOnlyXXX 仅实现get,用于验证字段值是否正确 * IReadOnlyNullableXXX 基本同上,不同在于允许 null 值,如果字段类型有Empty,则通常Empty等效于null * ---------------------------------------------------------------------- * 添加一个新的列的验证,例: * 定义一个 IXXX接口 * 定义一个 IReadOnlyXXX接口 * 如果允许null值,则再定义一个 IReadOnlyNullableXXX 接口 * ---------------------------------------------------------------------- * 验证过滤字段参数 params Type[] ignores * 传入的类型 为接口 IXXX 或 IReadOnlyXXX 或 IReadOnlyNullableXXX 三者等效 * 实现逻辑:通过反射Name字符串截取获取XXX作为比较 * ---------------------------------------------------------------------- * 对于模型类中某一个字段XXX,要么此类继承 IReadOnlyXXX 要么继承 IReadOnlyNullableXXX 不能同时继承两者 * ---------------------------------------------------------------------- * 如果对于某一个模型类中的某个类型,需要对另一个字段进行不同的验证,可添加新的类型字段接口 * 在 ColumnValidate 验证逻辑中 添加新的 is IXXX t switch(t.X) 进行不同的验证 * ---------------------------------------------------------------------- * 如果需要根据不同的模型类,进行输出不同的 errorMessage 原理同上 */ using System.Application.Columns; using static System.Application.Services.Implementation.ModelValidator; namespace System.Application { /// /// 模型验证提供者 /// public static class ModelValidatorProvider { public static void Init() { AddColumnValidate(ColumnValidate); AddColumnValidate(ColumnValidate); //AddColumnValidate(ColumnValidate); //AddColumnValidate(ColumnValidate); AddColumnValidate(ColumnValidate); AddColumnValidate(ColumnValidate); } #region ColumnValidates static string? ColumnValidate(IReadOnlyPhoneNumber value) { if (string.IsNullOrEmpty(value.PhoneNumber)) { return Constants.请输入手机号码哦; } if (!IsPhoneNumberCorrect(value.PhoneNumber)) { return Constants.请输入正确的手机号码哦; } return null; } static string? ColumnValidate(IReadOnlySmsCode value) { if (string.IsNullOrEmpty(value.SmsCode)) { return Constants.请输入短信验证码哦; } if (!IsSmsCodeCorrect(value.SmsCode)) { return Constants.短信验证码不正确; } return null; } //static string? ColumnValidate(IReadOnlyBirthDate value) //{ // if (value.BirthDate == default) // { // return Constants.请输入年龄; // } // return null; //} //static string? ColumnValidate(IReadOnlyGender value) //{ // if (!value.Gender.IsDefined()) // { // return Constants.请选择性别; // } // return null; //} static string? ColumnValidate(IReadOnlyAvatar value) { if (value.Avatar == default) { return Constants.请选择头像; } return null; } static string? ColumnValidate(IReadOnlyNickName value) { if (string.IsNullOrWhiteSpace(value.NickName)) { return Constants.请输入昵称; } else if (value.NickName.Length > Lengths.NickName) { return string.Format(Constants.昵称最大长度不能超过_, Lengths.NickName); } return null; } #endregion #region Validates /// /// 验证字符串是否为正确的手机号码 /// /// /// static bool IsPhoneNumberCorrect(string value) // 纯数字, 1开头,11位手机号码 => !(value.Length != Lengths.PhoneNumber || value[0] != '1' || !value.IsDigital()); /// /// 验证字符串是否为正确的短信验证码 /// /// /// static bool IsSmsCodeCorrect(string value) => !(value.Length != Lengths.SMS_CAPTCHA || !value.IsDigital()); #endregion private static class Constants { public const string 请输入手机号码哦 = "请输入手机号码哦"; public const string 请输入正确的手机号码哦 = "请输入正确的手机号码哦"; public const string 请输入短信验证码哦 = "请输入短信验证码哦"; public const string 短信验证码不正确 = "短信验证码不正确"; //public const string 请输入年龄 = "请选择年龄"; //public const string 请选择性别 = "请选择性别"; public const string 请选择头像 = "请选择头像"; public const string 请输入昵称 = "请输入昵称"; public const string 昵称最大长度不能超过_ = "昵称最大长度不能超过{0}个字"; public const string 请输入邀请码哦 = "请输入邀请码哦"; public const string 请输入正确的邀请码哦 = "请输入正确的邀请码哦"; } public static class Lengths { /// /// 颜色16进制值,#AARRGGBB /// public const int ColorHex = 9; /// /// 手机号码 /// public const int PhoneNumber = PhoneNumberHelper.Length; /// /// 昵称 /// public const int NickName = 20; /// /// 短信验证码 /// public const int SMS_CAPTCHA = 6; } } }