我有一个可以为空的枚举和API层的模型。在API层中,我获取模型并检查其状态。当我在此枚举中发送空值时,我从模型状态获得一条错误消息,因为枚举不能为空。是否可以更改属性以使其忽略并且在空的情况下不添加错误消息?
这是我的代码:
public class MyModel
{
[EnumDataType(typeof(MyEnum?))]
public MyEnum? MyEnum { get; set; }
}
这就是API层:
[HttpPost]
[Route("")]
public async Task<int> Post(MyModel myModel)
{
Validate(myModel);
if (!ModelState.IsValid)
{
//Stop the process and return a message...
}
//Continue with the process.
//Call the BL, etc.
}
答案 0 :(得分:1)
首先,您应该将传递给EnumDataType
属性的类型从MyEnum?
更改为MyEnum
。 EnumDataType
预计enum
类型,但MyEnum?
实际为Nullable<MyEnum>
,这将导致InvalidOperationException
。
然后在请求正文中发布的JSON应该正确地反序列化到模型:
{
"MyEnum": null
}
通过JSON.NET反序列化后,MyModel.MyEnum
属性将设置为null
。 EnumDataType
不会对null
值执行任何验证,您将获得有效的模型。
当我在此枚举中发送空值时,我收到来自的错误消息 模型状态因为枚举不能为空。
最可能的原因是您将null
值作为字符串发送:
{
"MyEnum": "null"
}
这样的JSON会导致反序列化错误(在JSON.NET中),因为反序列化器不知道如何将字符串"null"
转换为MyEnum
。这不是验证属性产生的错误,因为只有在deserilization成功完成时才会执行任何验证。检查this answer以获取有关模型反序列化和验证阶段的更多详细信息。