我有一个枚举:
public enum FilterOperator
{
[EnumMember(Value = "eq")]
Equals,
[EnumMember(Value = "gt")]
GreaterThan,
[EnumMember(Value = "lt")]
LessThan,
[EnumMember(Value = "in")]
In,
[EnumMember(Value = "like")]
Like
}
Run Code Online (Sandbox Code Playgroud)
以及包含枚举属性的类:
public class GridFilter
{
[JsonProperty("operator")]
[JsonConverter(typeof(StringEnumConverter))]
public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该对象通过WebAPI操作传入,并按预期对“ like”和“ in”进行反序列化,但不适用于“ lg”或“ gt”。知道为什么吗?
更新:好吧,“喜欢”和“从事”工作的原因是它们与枚举名称匹配。将GreaterThan重命名为Gt(etc)是可行的。因此,真正的问题是为什么不使用StringEnumConverter?
好吧,如果您希望在类的上下文之外反序列化时使用它,则必须将[JsonConverter(typeof(StringEnumConverter))]属性直接放在enum声明上,而不是Operator属性上:GridFilterGridFilter
[JsonConverter(typeof(StringEnumConverter))] // Add this
public enum FilterOperator
{
[EnumMember(Value = "eq")]
Equals,
[EnumMember(Value = "gt")]
GreaterThan,
[EnumMember(Value = "lt")]
LessThan,
[EnumMember(Value = "in")]
In,
[EnumMember(Value = "like")]
Like
}
public class GridFilter
{
[JsonProperty("operator")]
//[JsonConverter(typeof(StringEnumConverter")] // Remove this
public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
感谢大家的帮助!我意识到我做了什么。可悲的是,这很愚蠢,我提前为跑来跑去道歉。
由于我使用 GET,我将参数作为 url 查询参数发送,因此 WebAPI 使用普通 ModelBinder 来映射名称,而不是 JSON.NET。我实际上并没有发送 JSON,所以这是完全有道理的。这个问题帮助我认识到这一点: Complex type is getting null in a ApiController argument
我的选择是创建一个正确处理枚举的自定义模型绑定器,或者更改为 POST 并使用 JSON.stringify() 发送数据。
| 归档时间: |
|
| 查看次数: |
4662 次 |
| 最近记录: |