Asp.Net Web Api OData Controller (V3) 不使用全局配置的 JsonConverter

Cla*_*ato 5 c# enums json odata asp.net-web-api

我有一个 OData 控制器,它返回一个包含 Enum 属性的模型。Json 的默认行为是解析枚举以返回值名称而不是其 Int 值。我创建了一个自定义 Json 转换器,它使用 int 值(仍然是 OData 规范之后的字符串),并在 Global.asax 文件上指定了这个转换器。问题是 OdataController 根本不使用转换器。

我的问题是,我是否遗漏了什么或对 Odata 进行了错误的配置?我知道这与常规 APIController 一起工作正常。

第二个问题(实际上更像是一种意见),我使用 OData 的方式是错误的吗?到目前为止,使用 ODataController 已被证明对于我的场景来说麻烦而不是值得。

这是一个复制问题的示例:

public enum Currency {
    [Display(Name = "British Pound")]
    GBP = 1,
    [Display(Name = "Dollar")]
    USD = 2,
    [Display(Name = "Euro")]
    EUR = 3,
    [Display(Name = "Brazilian Real")]
    BRL = 4
}
public class OrderItem {
    public int Id { get; set; }
    public string Description { get; set; }
    public decimal Amount { get; set; }
    public Enumerators.Currency Currency { get; set; }
}
// api/OrderItem
public class OrderItemController : ApiController{
    public IEnumerable<Models.OrderItem> Get(){
        List<Models.OrderItem> toReturn = new List<Models.OrderItem>();
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Rubiks cube",
            Amount = 10,
            Currency = Models.Enumerators.Currency.GBP
        });
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Risk",
            Amount = 5,
            Currency = Models.Enumerators.Currency.USD
        });
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Ticket to ride",
            Amount = 25,
            Currency = Models.Enumerators.Currency.EUR
        });

        return toReturn;
    }
}
// odata/OrderItems
public class OrderItemsController : ODataController{
    private static ODataValidationSettings _validationSettings = new ODataValidationSettings();

    // GET: odata/OrderItems
    public IHttpActionResult GetOrderItems(ODataQueryOptions<OrderItem> queryOptions)
    {
        List<Models.OrderItem> toReturn = new List<Models.OrderItem>();
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Rubiks cube",
            Amount = 10,
            Currency = Models.Enumerators.Currency.GBP
        });
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Risk",
            Amount = 5,
            Currency = Models.Enumerators.Currency.USD
        });
        toReturn.Add(new Models.OrderItem() {
            Id = 1,
            Description = "Ticket to ride",
            Amount = 25,
            Currency = Models.Enumerators.Currency.EUR
        });

        // return Ok<IEnumerable<OrderItem>>(orderItems);
        return Ok(toReturn);
    }
}

protected void Application_Start(){
    GlobalConfiguration.Configure(WebApiConfig.Register);
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Helpers.IntEnumConverter());
}
Run Code Online (Sandbox Code Playgroud)

按预期调用 api/orderitem 返回,货币为“1”、“2”或“3”。
调用 odata/OrderItems 返回默认的 Json 格式化程序,货币为“GBP”、“USD”或“EUR”