2017-02-03 3 views
4

Wir haben mehrere API-Controller akzeptieren GET-Anforderungen wie folgt:[FromUri] Serialisierung mit APIController

//FooController 
public IHttpActionResult Get([FromUri]Foo f); 
//BarController 
public IHttpActionResult Get([FromUri]Bar b); 

jetzt - wir möchten (oder gezwungen sind) Datetime-Zeichenfolge-Format innerhalb von GET Query-String ändern global

"yyyy-MM-ddTHH:mm:ss" -> "yyyy-MM-ddTHH.mm.ss" 

Nach dem Wechsel alle [FromUri] Serialisierungen mit Klassen enthalten DateTime Typen versagen.

Gibt es eine Möglichkeit [FromUri] Serialisierung ergänzen das Datums- und Uhrzeitformat in Query-String zu akzeptieren? Oder müssen wir eine benutzerdefinierte Serialisierung für alle API-Parameter erstellen, um das neue DateTime-Zeichenfolgenformat zu unterstützen?

EDIT: Beispiel wie gewünscht

public class Foo { 
public DateTime time {get; set;} 
} 

//FooController. Let's say route is api/foo 
public IHttpActionResult Get([FromUri]Foo f); 

GET api/foo?time=2017-01-01T12.00.00 
+1

hh.mm.ss - Punkte ist cousing Erweiterung Problem. http://stackoverflow.com/questions/20404254/encode-email-to-pass-to-web-api – levent

+0

Ok, aber das ist nicht der Punkt. Nehmen wir an, die Punkte würden durch - – supertopi

+0

ersetzt werden. Wenn Sie js verwenden, können Sie den datetime-Wert vor der Übergabe an den Controller mit dem Befehl uricomponent codieren. Dann dekodiert und deserialisiert der Controller es. – Woot

Antwort

2

dieses Verhalten anwenden zu können, die Sie für alle Arten Datetime bei allen Modellen wollen, dann werden Sie wollen eine custom binder for the DateTime type and apply it globally schreiben.

Datetime Modell Binder

public class MyDateTimeModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(DateTime)) 
      return false; 

     var time = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (time == null) 
      bindingContext.Model = default(DateTime); 
     else 
      bindingContext.Model = DateTime.Parse(time.AttemptedValue.Replace(".", ":")); 

     return true; 
    } 
} 

WebAPI Config

config.BindParameter(typeof(DateTime), new MyDateTimeModelBinder()); 
+0

Danke für die bis zu schreiben, aber die Frage war über die Serialisierung global verändern und mit '[FromUri]', weil mehrere API Parameterklassen haben mehrere Attribute. – supertopi

+2

Haben Sie den DateTime-Modellbinder unten angezeigt? Es befasst sich mit der globalen Anwendung des Verhaltens. Ich werde den Post bearbeiten, um das Beispiel zu entfernen, das den Beispielcode adressiert, damit die tatsächliche Antwort nicht verdeckt wird. – davidmdem