忽略 EnumDataType 数据注释属性中的空值
Ignore nulls in EnumDataType data annotation attribute
我有一个带有可空枚举和 API 层的模型。在 API 层中,我获取模型并检查其状态。当我在此枚举中发送空值时,我从模型状态中收到一条错误消息,因为枚举不能为空。是否可以更改属性,以便在 null 的情况下忽略而不添加错误消息?
这是我的代码:
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.
}
首先,您应该将传递给 EnumDataType
属性的类型从 MyEnum?
更改为 MyEnum
。 EnumDataType
期望 enum
类型但 MyEnum?
实际上是 Nullable<MyEnum>
这将导致 InvalidOperationException
.
然后在请求正文中发布的以下 JSON 应正确反序列化为模型:
{
"MyEnum": null
}
JSON.NET反序列化后,MyModel.MyEnum
属性将被设置为null
。 EnumDataType
不会对 null
值执行任何验证,您将获得有效模型。
When I send a null value in this enum I get an error message from the
model state because the enum cannot be null.
最可能的原因是您将 null
值作为字符串发送:
{
"MyEnum": "null"
}
这样的JSON会导致反序列化错误(在JSON.NET内),因为反序列化器不知道如何将字符串"null"
转换为MyEnum
。这不是验证属性产生的错误,因为只有在反序列化成功完成时才会执行任何验证。检查 this answer 以获取有关模型反序列化和验证阶段的更多详细信息。
我有一个带有可空枚举和 API 层的模型。在 API 层中,我获取模型并检查其状态。当我在此枚举中发送空值时,我从模型状态中收到一条错误消息,因为枚举不能为空。是否可以更改属性,以便在 null 的情况下忽略而不添加错误消息?
这是我的代码:
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.
}
首先,您应该将传递给 EnumDataType
属性的类型从 MyEnum?
更改为 MyEnum
。 EnumDataType
期望 enum
类型但 MyEnum?
实际上是 Nullable<MyEnum>
这将导致 InvalidOperationException
.
然后在请求正文中发布的以下 JSON 应正确反序列化为模型:
{
"MyEnum": null
}
JSON.NET反序列化后,MyModel.MyEnum
属性将被设置为null
。 EnumDataType
不会对 null
值执行任何验证,您将获得有效模型。
When I send a null value in this enum I get an error message from the model state because the enum cannot be null.
最可能的原因是您将 null
值作为字符串发送:
{
"MyEnum": "null"
}
这样的JSON会导致反序列化错误(在JSON.NET内),因为反序列化器不知道如何将字符串"null"
转换为MyEnum
。这不是验证属性产生的错误,因为只有在反序列化成功完成时才会执行任何验证。检查 this answer 以获取有关模型反序列化和验证阶段的更多详细信息。