WebAPI e retorno de campo DateTime - Request Ajax trazendo valor em formato texto ao invés de objeto tipo DateTime
Detalhando a Situação
Recentemente passei por um problema de programação que já havia passado antes, mas contornado "via código".
O problema não é incomum e depende exclusivamente de como você precisa tratar tal tipo de conteúdo em sua View.
Considere o seguinte fluxo (sem entrar em muitos detalhes):
- View faz o request Ajax a um Método no Controller WebAPI.
- Método processa e retorna um registro ou lista do Domínio.
- Método converte dados do Domínio para DTO.
- Método retorna os dados para a View.
O Problema
No meu caso utilizo ExtJS como framework como client/browser, então os requests avulsos da view são feitos com a função Ext.Ajax.request(). Não testei usando jQuery, mas creio que não haja diferença.
Quando um request é feito as propriedades do tipo DateTime retornam o valor como texto no seguinte formato: 2014-01-01T00:00:00. Só que para ser trabalhando na view de maneira direta, ou seja, cálculos, componentes que só recebem valor data/hora (ou data), é preciso que esse texto seja convertido para um objeto de data Javascript, algo como Date {Mon Jan 01 2014 00:00:00 GMT-0200}.
Considerando um request feito por uma Store do Ext.Net (abstração do ExtJS), se apontamos para o mesmo método no controller da WebAPI, e configurado o Record Field da Store com algo assim:
<ext:RecordField Name="PropriedadeDataNoDto" Type="Date" DateFormat="yyyy-MM-ddTh:i:s" />
Desta maneira a view consegue fazer com que o retorno seja o esperado, um objeto data/hora.
A Solução
A solução definitiva que encontrei, a que implica que todas as requisições no nível de WebAPI fiquem corretas, está relacionada a configurar um "JsonFormatter" aplicado na serialização do conteúdo, mas não encontrei nenhuma solução para a minha necessidade, nem mesmo os "formatters" padrões tipo ISO e outros, então tive que adequar uma.
Criei uma classe formatter chamada JavaScriptDateTimeConverter (atenção que existe uma classe com mesmo nome).
E em WebApiConfig.cs a lógica para que a classe seja utilizada.
E em WebApiConfig.cs a lógica para que a classe seja utilizada.
Um ponto que não avaliei, pode ser que fazendo um request com algum parâmetro a mais o retorno de propriedades/campos DateTime ocorra como o esperado, mas infelizmente não pude testar, de qualquer não encontrei em nenhum artigo referência a essa possibilidade.
Comentários
Postar um comentário