在反序列化和验证阶段检测到的错误之间经常发生混淆。
假设您有以下内容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.None
是一个有效值MyEnum
。这就是为什么你不会看到"Custom Error Message"
in ModelState
errors.
现在,如果您发布以下数据:
{
"Id": 123,
"MyEnumProp": 5
}
在反序列化阶段不会发生错误,因为以下分配是相当合法的,即使它没有多大意义:
MyEnum v = (MyEnum)5;
因此解串器不会检测到任何错误。然而现在EnumDataType
验证开始发挥作用。它检测到5
不是有效值MyEnum
. ModelState.IsValid
被设定为false
以及中指定的错误消息EnumDataType.ErrorMessage
已登记 ("Custom Error Message"
).
如果您希望反序列化和验证错误具有相同的自定义消息,则应提升到反序列化器 (Json.NET) 级别并使用其扩展点来实现此目的。