arp*_*tro 5 enums data-annotations asp.net-core asp.net-core-2.0
在我的.net core 2.0 Web API中,我在模型属性上使用EnumDataType()验证属性。验证失败时,自定义错误消息为空。我不确定为什么会这样-
EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")
public MyEnum MyEnumProp {get; set;}
Run Code Online (Sandbox Code Playgroud)
我检查了其他具有[Required],[MinLength]的属性,并且所有属性均生成自定义错误消息。难道我做错了什么?还有其他方法吗?
在反序列化和验证阶段发现的错误之间经常混淆。
说您有以下内容enum:
public enum MyEnum
{
None,
Value1,
Value2
}
Run Code Online (Sandbox Code Playgroud)
和以下模型:
public class TestModel
{
[Required]
public int? Id { get; set; }
[EnumDataType(typeof(MyEnum), ErrorMessage = "Custom Error Message")]
public MyEnum MyEnumProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
发布数据时:
{
"Id": 123,
"MyEnumProp": "UnexistingEnumValue"
}
Run Code Online (Sandbox Code Playgroud)
该错误将在反序列化阶段发生(对于这种情况,在Json.NET中)。反序列化器无法将字符串"UnexistingEnumValue"从中转换为某些值MyEnum。在这种情况下,解串器将注册以下模型绑定错误:Requested value 'UnexistingEnumValue' was not found。
ModelState.IsValid将设置为false,但是的值MyEnumProp将保留为默认值MyEnum.None。由EnumDataType属性执行的验证不会检测到任何错误,因为MyEnum.None是的有效值MyEnum。这就是为什么你不会看到"Custom Error Message"的ModelState错误。
现在,如果您发布以下数据:
{
"Id": 123,
"MyEnumProp": 5
}
Run Code Online (Sandbox Code Playgroud)
在反序列化阶段不会发生任何错误,因为即使没有太大意义,以下分配也是合法的:
MyEnum v = (MyEnum)5;
Run Code Online (Sandbox Code Playgroud)
因此解串器将不会检测到任何错误。但是现在EnumDataType验证开始起作用了。并且它检测到的5值无效MyEnum。ModelState.IsValid设置为,false并EnumDataType.ErrorMessage注册中指定的错误信息("Custom Error Message")。
如果您希望针对反序列化和验证错误使用相同的自定义消息,则应提高反序列化器(Json.NET)的级别,并为此目的使用其可扩展性点。
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |