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