C# Model Validation 合法范围内日期被判定为无效问题
问题原因
- 核心问题是模型字段类型与校验规则不匹配:你给
string类型的DOB字段添加了typeof(DateTime)类型的Range校验,校验逻辑无法直接将字符串类型的日期和DateTime范围做正确比对,直接导致校验失效。 - HTML5
type="date"输入框提交的日期格式为yyyy-MM-dd,你Range特性中定义的范围值是1/1/2000这类月/日/年格式,不同区域的系统日期解析规则不同时,也会出现范围解析错误的问题。
解决方法
方案1(推荐):修改模型字段为DateTime类型
直接将DOB字段的类型从string改为DateTime,同时将Range的范围值改为ISO标准日期格式避免解析歧义,修改后模型代码如下:
[Display(Name = "Date of Birth")] [Required(AllowEmptyStrings = false, ErrorMessage = "This field is required.")] [Range(typeof(DateTime), "2000-01-01", "2010-01-01", ErrorMessage = "Date is out of Range")] [DataType(DataType.Date)] public DateTime DOB { get; set; }
视图代码可以直接改用EditorFor减少手动配置:
@Html.EditorFor(m => m.DOB, new { @class = "form-control", @id = "dob" }) @Html.ValidationMessageFor(m => m.DOB)
方案2(仅特殊场景必须用string存储时使用):自定义字符串日期校验
如果业务要求必须用字符串存储日期,就移除现有的DateTime类型Range校验,自己实现针对字符串格式的日期范围校验逻辑,或者用正则表达式先匹配日期格式再做范围判断。
内容的提问来源于stack exchange,提问作者Bill Kindig
相关产品推荐
相关产品推荐

