2016-12-07 1 views
0

Ich habe folgendes Modell:Customizing OData Datetime-Ausgabe

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

Wenn ein make a get Anfrage OData ein Datetime anstelle eines Datetime zurück. Zum Beispiel die Anfrage '/ api/rest/people/1' zurück:

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

Was ich will? Ich muss nur den Datumswert "12/7/2016" zurückgeben. Ich habe versucht, einen benutzerdefinierten ODataPayloadValue-Konverter zu implementieren, aber OData scheint den 'DateTime'-Typ nicht zu verstehen.

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

Antwort

0

Nach einigen Recherchen fand ich heraus, dass es einen Weg zu erreichen, was ich will von zwei Klassen der Umsetzung:

// 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

Der einfachste Weg - erweitern Sie Ihr Modell wie folgt aus:

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

Vielen Dank für Ihre Antwort, aber wenn ich so implementieren, habe ich zwei Eigenschaften in meinem Modell, eine Zeichenfolge und die andere wird eine DateTime, außerdem könnte der Verbraucher der API denken, dass er/sie Werte setzen kann für die 'str Geburtsdatum ". Ich habe so etwas wie einen Ausgabefilter gedacht ... – Bruno