quinta-feira, 2 de fevereiro de 2017

Blog da Lambda3 - ASP.NET Core Model Binder para Datas pt-BR

por Vinicius Quaiato
Fala galera, belezinha?
Esses dias tive um pequen problema e quero compartilhar como resolvi isso. Basicamente um input de dados no meu sistema ASP.NET Core estava tratando o formato da data digitada de maneira diferente dependendo da máquina onde a aplicação estivesse rodando: na minha máquina, cujo sistema está em inglês com as datas no padrão MM/dd/yyyy as validações do ASP.NET falhavam. Já na máquina de outro membro do time, com o sistema em português e as datas no padrão dd/MM/yyyy as validações funcionavam. Nos servidores algo parecido acontecia, bem chato.
Uma das maneiras de resolver este problema é instruindo o ASP.NET a usar um ModelBinder espeífico para este campo, e então converter a string para uma data utilizando o locale correto:
[ModelBinder(BinderType = typeof(PtBrDateTimeBinder))]
public class FooViewModel{
    public DateTime? DataNascimento {get; set;}
}

public class PtBrDateTimeBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var value = valueProviderResult.FirstValue;
        DateTime outDate;
        var parsed = DateTime.TryParse(value, CultureInfo.GetCultureInfo("pt-BR").DateTimeFormat,
            DateTimeStyles.None, out outDate);

        bindingContext.Result = parsed ? ModelBindingResult.Success(outDate) : ModelBindingResult.Failed();

        return Task.FromResult(0);
    }
}
Basicamente o que fazemos é obter o provedor de valores para a propriedade DataNascimento, e então obter o valor desta pripriedade como uma string (antes do binding ser feito no model).
Então faço uma simples conversão para DateTime, e informo para o ModelBindingContext se houve sucesso no binding ou erro. No caso de sucesso eu informo o valor convertido.
Bem simples e tranquilo. O interessante desta abordagem é que ela pode ser utilizada em pontos específicos da aplicação, sem que seja necessária a alteração de todos os requests, models, etc. pode ser utilizando em pontos isolados e específicos.
Abraços,
Quaiats.

Nenhum comentário:

Postar um comentário