【问题标题】:EnumDataType() attribute validation error message not displayingEnumDataType() 属性验证错误消息未显示
【发布时间】:2020-08-24 20:50:50
【问题描述】:

在我的 .net core 2.0 Web API 中,我在我的模型属性上使用 EnumDataType() 验证属性。当验证失败时,自定义错误消息为空。我不知道为什么会这样 -

[EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")]
public MyEnum MyEnumProp {get; set;}

我检查了具有 [Required]、[MinLength] 的其他属性,并且所有属性都在生成自定义错误消息。难道我做错了什么?还有其他方法吗?

【问题讨论】:

    标签: c# asp.net-core enums asp.net-core-2.0 data-annotations


    【解决方案1】:

    反序列化和验证阶段检测到的错误经常混淆。

    假设你有以下enum

    public enum MyEnum
    {
        None,
        Value1,
        Value2
    }
    

    以下型号:

    public class TestModel
    {
        [Required]
        public int? Id { get; set; }
    
        [EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")]
        public MyEnum MyEnumProp { get; set; }
    }
    

    当您发布数据时:

    {
      "Id": 123,
      "MyEnumProp": "UnexistingEnumValue"
    }
    

    错误将在反序列化阶段发生(在这种情况下,在 Json.NET 中)。反序列化器无法将字符串 "UnexistingEnumValue" 转换为来自 MyEnum 的某些值。 在这种情况下,反序列化器将注册以下模型绑定错误:Requested value 'UnexistingEnumValue' was not found

    ModelState.IsValid 将设置为 false,但 MyEnumProp 的值将保留其默认值 MyEnum.None。由EnumDataType 属性执行的验证不会检测到任何错误,因为MyEnum.NoneMyEnum 的有效值。这就是为什么您不会在ModelState 错误中看到"Custom Error Message"

    现在,如果您发布以下数据:

    {
      "Id": 123,
      "MyEnumProp": 5
    }
    

    在反序列化阶段不会发生错误,因为即使没有多大意义,下面的赋值也是相当合法的:

    MyEnum v = (MyEnum)5;
    

    所以反序列化器不会检测到任何错误。但是现在EnumDataType 验证开始发挥作用。它检测到5 不是MyEnum 的有效值。 ModelState.IsValid 设置为 false 并注册了 EnumDataType.ErrorMessage 中指定的错误消息 ("Custom Error Message")。

    如果您希望为反序列化和验证错误提供相同的自定义消息,您应该提升到反序列化器 (Json.NET) 的级别并为此目的使用其扩展点。

    【讨论】:

    • 感谢您放下这个。但是,请您帮忙 - 如何提升到反序列化器的级别?
    • 我之前没有做过这就是为什么我不能为您提供示例代码。此外,我不喜欢这种方法,也不会将其添加到我自己的项目中。这种定制的问题在于它应该针对任何受支持的媒体格式化程序执行。假设您找到了一种处理 JSON 的方法,但是也可以用于将数据发布到 API 的 XML 格式呢?因此,您应该添加过多的自定义代码而不添加可见值。
    • ASP.NET Core 团队似乎也意识到了我们正在讨论的问题。检查this issuethisthisthis commit。因此,您可能应该等待 ASP.NET Core 2.1(或使用预览版)并检查这些更改是否生效。
    猜你喜欢
    • 2020-06-20
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2017-01-06
    • 2018-11-05
    相关资源
    最近更新 更多