C#多对象验证疑问:Model.IsValid能否替代空值判断?
问题
我正在开发一款独立应用,负责分析传入的JSON文件并返回结果,通过一次API调用接收所有对象。在分析前需验证对象,想确认使用data.DataOne != null && data.DataTwo != null验证是否正确,还是仅用Model.IsValid就足够?
JSON格式示例:
{ "DataOne": { "Name":"abc", "Age":21 }, "DataTwo": { "Designation":"Tiktoker", "Salary":"NA" } }
C#代码示例:
[HttpPost] public async Task<Analyse> Analyse([FromBody] FinalData data) { if (data.DataOne != null && data.DataTwo != null) { if (ModelState.IsValid) { // do something } else { } } }
模型定义:
public class FinalData { public DataOne DataOne {get;set;} public DataTwo DataTwo {get;set;} } public class DataOne{ [Required] public string Name {get;set;} public string Age {get;set;} } public class DataTwo{ public string Designation {get;set;} public string Salary {get;set;} }
解答
- 仅用
ModelState.IsValid不够:默认情况下,FinalData里的DataOne和DataTwo是引用类型,即使JSON中没有传入这两个字段(或者设为null),ModelState不会判定为无效,因为引用类型本身允许为null。仅靠ModelState.IsValid无法确保这两个对象存在,后续操作可能触发空引用异常。 - 你当前的
data.DataOne != null && data.DataTwo != null验证逻辑是正确的,但可以通过修改模型简化流程:在FinalData的DataOne和DataTwo属性上添加[Required]特性,这样ModelState.IsValid会自动验证这两个对象不能为null,无需手动判断。
优化后的模型定义
public class FinalData { [Required] public DataOne DataOne {get;set;} [Required] public DataTwo DataTwo {get;set;} } public class DataOne{ [Required] public string Name {get;set;} public string Age {get;set;} } public class DataTwo{ public string Designation {get;set;} public string Salary {get;set;} }
优化后的API代码
[HttpPost] public async Task<Analyse> Analyse([FromBody] FinalData data) { if (ModelState.IsValid) { // do something } else { // 处理验证失败逻辑,比如返回错误信息 } }
修改后,当JSON中缺少DataOne/DataTwo或者它们为null时,ModelState.IsValid会直接返回false,同时也会验证DataOne里的Name字段是否存在,一次性完成所有必要的验证。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

