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”