使用[BindRequired]标记DateTime未触发ModelState失效,求有效校验方案
解决[BindRequired]无法触发ModelState失效的问题
这个问题我之前也踩过坑,根源其实在DateTime是值类型这一点上:
当属性是值类型时,哪怕请求体里完全没有对应的字段,ASP.NET Core的模型绑定系统也会自动给它赋值为值类型的默认值(比如DateTime的默认值是DateTime.MinValue)。而[BindRequired]特性的核心作用是要求绑定过程必须成功将请求中的值绑定到该属性,但因为值类型有默认兜底,绑定系统会认为“已经完成了绑定”,自然不会触发ModelState失效。
正确的解决方法
把DateTime改成可空值类型DateTime?,同时保留[BindRequired]特性:
public class PostModel { [BindRequired] public DateTime? Date { get; set; } }
控制器代码不需要做任何修改,当你提交{}这样的空请求体时,模型绑定系统会因为找不到Date字段,无法给这个可空属性赋值(会保持null),此时[BindRequired]就会检测到该属性未被成功绑定,直接标记ModelState.IsValid为false。
如果你的业务逻辑要求Date必须是有效时间,这个方案也完全兼容——[BindRequired]已经确保了请求里必须包含Date字段,绑定完成后Date肯定有值,你可以安全地用Date.Value来访问它。
内容的提问来源于stack exchange,提问作者Bastiflew
相关产品推荐
相关产品推荐

