2016-07-28 3 views
0

Внутри моего WebAPI У меня есть метод, который позволяет пользователю зарегистрироваться на мою страницу.WebAPI разрешает только один формат даты

[AllowAnonymous] 
[Route("create")] 
[HttpPost] 
public async Task<IHttpActionResult> CreateAccount(MyModel newAccount) 
{ 
} 

В моей модели есть поле DateTime, которое заполняется датой, когда запрос сделан.
Все работает нормально, когда пользователь отправляет, например, 1990-02-07, но для 07.02.1980 Я получаю неправильное значение внутри моей модели - значения даты до месяца.
Я знаю, что могу создать пользовательский JsonConverter, как показано here, но могу ли я сделать это по всему миру?

Внутри Startup.cs у меня есть:

config.MapHttpAttributeRoutes(); 

config.Formatters.Remove(config.Formatters.XmlFormatter); 
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
jsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd"; 
jsonFormatter.SerializerSettings.DateParseHandling = DateParseHandling.DateTime; 

, но все же я могу сделать запрос с недопустимым форматом дата.

Я хотел бы глобально разрешить единый формат для даты и времени.
Я хотел бы разрешить yyyy-MM-dd (1990-02-07) и yyyy-MM-dd hh:mm:ss (2016-07-28 11:56:00) и вернуть badrequest или неверный запрос, когда задан другой формат без обработки данных.

ответ

1

Вы можете создать свой собственный JSon медиа форматировщик на дату и зарегистрировать его для типа DateTime .. Вот пример код для СМИ форматировщика

public class JsonDateFormatter : JsonMediaTypeFormatter 
{ 
    public override System.Threading.Tasks.Task<Object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger, CancellationToken cancellationToken) 
    { 
     //Do date formatting here 
    } 

    public override bool CanReadType(Type type) 
    { 
     if (type == typeof(DateTime)) 
      return true; 
     return false; 
    } 
} 

и вот как вы можете зарегистрировать его в Startup.cs

config.Formatters.Add(new JsonDateFormatter()); 
+0

Благодарим вас за это. Внутри 'ReadFromStreamAsync' я должен прочитать строку и преобразовать ее в DateTime. Я должен бросить исключение, если формат другой, который я ожидаю? В идеале я хотел бы вернуть ошибку 'Invalid format', так же, как возвращает ValidationAttribute. Могу ли я сделать это с помощью пользовательского форматирования? – Misiu

+0

@Misiu Вам необходимо прочитать поток в ReadFromStreamAsync, а затем преобразовать его в формат даты, который вы хотите. Вы можете исключить исключение из этого метода, но я не думаю, что вы можете сделать это так же, как ValidationAttribute – Paresh

+0

. Я попробую это и дам вам знать, работает ли он так, как хотелось бы, чтобы он работал. – Misiu

Смежные вопросы