【问题标题】:Ignore nulls in EnumDataType data annotation attribute忽略 EnumDataType 数据注释属性中的空值
【发布时间】:2018-04-20 16:20:05
【问题描述】:

我有一个带有可空枚举和 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.
}

【问题讨论】:

    标签: c# api asp.net-web-api data-annotations


    【解决方案1】:

    首先,您应该将传递给EnumDataType 属性的类型从MyEnum? 更改为MyEnumEnumDataType 期望 enum 类型,但 MyEnum? 实际上是 Nullable&lt;MyEnum&gt;,这将导致 InvalidOperationException

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

    {
      "MyEnum": null
    }
    

    通过 JSON.NET 反序列化后,MyModel.MyEnum 属性将设置为nullEnumDataType 不会对 null 值执行任何验证,您将获得有效的模型。

    当我在这个枚举中发送一个空值时,我从 模型状态,因为枚举不能为空。

    最可能的原因是您将null 值作为字符串发送:

    {
      "MyEnum": "null"
    }
    

    这样的 JSON 会导致反序列化错误(在 JSON.NET 内部),因为反序列化器不知道如何将字符串 "null" 转换为 MyEnum。这不是验证属性产生的错误,因为只有在反序列化成功完成时才会执行任何验证。有关模型反序列化和验证阶段的更多详细信息,请查看 this answer

    【讨论】:

    • 这很有趣。我想详细说明可为空的枚举。假设我的模型应该接受 null 或 Enum 的正确值,例如1,2,3。在反序列化时,它与 null 一起使用(不抛出异常)。但是在验证时它会抛出InvalidOperationException - 正如你所提到的。这种情况如何处理?
    猜你喜欢
    • 2015-01-09
    • 2011-09-22
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多