2017-02-03 8 views
4

У нас есть несколько контроллеров API принимает запросы GET так:комплемента [FromUri] сериализации с APIController

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

Теперь - мы хотели бы (или, вынуждены) изменить формат строки DateTime в GET строки запросов глобально

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

После изменения всех [FromUri] сериализаций с классами, содержащих DateTime типов неудачи.

Есть ли способ дополнить серию сериализации, чтобы принять формат DateTime в строке запроса? Или нам нужно создать пользовательскую сериализацию для всех параметров API для поддержки нового формата строки DateTime?

EDIT: пример, как запрошенной

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 - это точки cousing проблема расширения. http://stackoverflow.com/questions/20404254/encode-email-to-pass-to-web-api – levent

+0

Хорошо, но это не главное. Предположим, что точки будут заменены на: – supertopi

+0

, если вы используете js, вы можете encodingURIComponent значение datetime, прежде чем передавать его в контроллер. Затем контроллер будет декодировать и десериализовать его. – Woot

ответ

2

Чтобы применить это поведение, которое вы хотите во всех типах DateTime на всех моделях, то вы хотите, чтобы написать custom binder for the DateTime type and apply it globally.

DateTime Модель 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

Спасибо за запись, но вопрос состоял в изменении сериализации по всему миру и использовании '[FromUri]', потому что несколько классов параметров API имеют несколько атрибутов. – supertopi

+2

Вы видели подкатегорию модели DateTime внизу? В нем рассматривается применение поведения по всему миру. Я отредактирую сообщение, чтобы удалить пример, обращаясь к образцу кода, чтобы фактический ответ не был закрыт. – davidmdem