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:

public class FooViewModel{
    [ModelBinder(BinderType = typeof(PtBrDateTimeBinder))]
    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);

        var result = ModelBindingResult.Success(outDate);
        if (!parsed)
        {
            result = ModelBindingResult.Failed();
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Data inválida");
        }

        bindingContext.Result = result;

        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.

(imagem: http://design-milk.com/2012-modern-calendars/)

Abraços,
Quaiats.

Vinicius Quaiato