2016-12-07 5 views
0

I以下のモデルがあります:カスタマイズのODataのDateTime出力

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

ときのメイクのDateTimeの代わりにのDateTimeOffsetを返すのOData get要求。たとえば、 '/ api/rest/people/1'というリクエストは次の結果を返します。

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

私は何を望みますか?私はちょうど日付値 "12/7/2016"を返す必要があります。私はカスタムODataPayloadValueコンバータを実装しようとしましたが、ODataは 'DateTime'タイプを理解していないようです。

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); 
    } 

答えて

0

いくつかの研究を行った後、私は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; 
    } 
} 
0

最も簡単な方法 - このようなあなたのモデルを拡張:

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(); }} 
    .... 
} 
+0

答えていただきありがとうございますが、このように実装している場合は、モデル内に2つのプロパティ、1つの文字列、もう1つはDateTimeになります。さらに、APIの消費者は、 'strのために生年月日 'となります。私は出力フィルタのようなものを考えていた... – Bruno

関連する問題