【问题标题】:Customizing OData DateTime output自定义 OData 日期时间输出
【发布时间】:2016-12-08 19:54:28
【问题描述】:

我有以下型号:

public class PersonModel {
    public int Id {get; set;}
    public DateTime BirthDay {get;set;}
    ....
}

当发出获取请求时,OData 返回 DateTimeOffset 而不是 DateTime。例如,请求 '/api/rest/people/1' 返回:

{
 id:1,
 birthDay: "12/7/2016 8:57:58 PM +00:00"
 ....
}

我想要什么?我只需要返回日期值“12/7/2016”。我尝试实现自定义 ODataPayloadValue 转换器,但 OData 似乎不理解“日期时间”类型。

 public override object ConvertToPayloadValue(object value, IEdmTypeReference edmTypeReference)
    {
        /// There isn't a IEdmtypeRefere.IsDateTime 
        /// Thus OData always think that DateTime is equals to DateTimeOffset
        if (value is DateTime)
        {
            ///Do some stuff here.
        }

        return base.ConvertToPayloadValue(value, edmTypeReference);
    }

【问题讨论】:

    标签: asp.net-mvc datetime asp.net-web-api odata


    【解决方案1】:

    最简单的方法 - 像这样扩展您的模型:

    public class PersonModel {
        public int Id {get; set;}
        public DateTime BirthDay {get;set;}
        // add this property and you get it. You can rename it if you want
        public string BirthDate {get {return this.BirthDay.ToShourtDateString(); }}
        ....
    }
    

    【讨论】:

    • 感谢您的回答,但是如果我这样实现,我的模型中将有两个属性,一个是字符串,另一个是 DateTime,此外,API 的使用者可能会认为他/她可以为“字符串 BirthDate”设置值。我在想像输出过滤器之类的东西......
    【解决方案2】:

    经过一番研究,我发现有一种方法可以通过实现两个类来实现我想要的:

     // A custom serializer provider to inject the AnnotatingEntitySerializer.
    public class CustomODataSerializerProvider : DefaultODataSerializerProvider
    {
        private AnnotatingEntitySerializer _annotatingEntitySerializer;
    
        public CustomODataSerializerProvider()
        {
            _annotatingEntitySerializer = new AnnotatingEntitySerializer(this);
        }
    
        public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType)
        {
            if (edmType.IsEntity())
            {
                return _annotatingEntitySerializer;
            }
    
            return base.GetEdmTypeSerializer(edmType);
        }
    }
    
    
    // A custom entity serializer that adds the score annotation to document entries.
    public class AnnotatingEntitySerializer : ODataEntityTypeSerializer
    {
        public AnnotatingEntitySerializer(ODataSerializerProvider serializerProvider)
            : base(serializerProvider)
        {
        }
    
        public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)
        {
            ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext);
    
            PersonModel person = entityInstanceContext.EntityInstance as PersonModel;
            var property = entry.Properties.Where(x => x.Name == "birthDate").FirstOrDefault();
            property.Value = ((DateTimeOffset)property.Value).DateTime.ToShortDateString();
    
    
            return entry;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多