C#中如何为DateTime类型添加自定义日期格式验证?
实现方案
你需要调整属性类型 + 自定义验证规则,原因是直接用DateTime类型的话,不符合常规日期格式的输入会在模型绑定阶段直接抛出错误,无法进入自定义验证逻辑:
步骤1:先引入所需命名空间
using System.ComponentModel.DataAnnotations; using System.Globalization;
步骤2:自定义符合yyyyDDmm格式要求的验证特性
public class YyyyDdMmDateAttribute : ValidationAttribute { private const string TargetFormat = "yyyyddMM"; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // 非空校验交给[Required]特性处理,这里直接放行空值 if (value == null) return ValidationResult.Success; var dateInput = value.ToString(); // 先校验是否为8位纯数字 if (dateInput.Length != 8 || !long.TryParse(dateInput, out _)) { return new ValidationResult($"日期格式错误,要求格式为yyyyDDmm,例如20211709"); } // 再校验是否为合法的对应格式日期 if (!DateTime.TryParseExact(dateInput, TargetFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out _)) { return new ValidationResult($"日期格式错误,要求格式为yyyyDDmm,例如20211709"); } return ValidationResult.Success; } }
步骤3:修改你的Item类定义
public class Item { [Required] [YyyyDdMmDate] public string RecDate { get; set; } // 如果业务需要用到DateTime类型的日期值,可以额外加一个只读转换属性 public DateTime? ConvertedRecDate => DateTime.TryParseExact(RecDate, "yyyyddMM", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? date : null; }
验证触发方式
- ASP.NET Core场景:控制器中调用
ModelState.IsValid即可自动触发验证,格式不合法时会自动返回对应错误 - 其他场景手动验证:调用
Validator.TryValidateObject方法即可触发所有验证规则
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

