忽略 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? 更改为 MyEnumEnumDataType 期望 enum 类型但 MyEnum? 实际上是 Nullable<MyEnum> 这将导致 InvalidOperationException.

然后在请求正文中发布的以下 JSON 应正确反序列化为模型:

{
  "MyEnum": null
}

JSON.NET反序列化后,MyModel.MyEnum属性将被设置为nullEnumDataType 不会对 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 以获取有关模型反序列化和验证阶段的更多详细信息。