Press enter to see results or esc to cancel.

Sacadas do MVC: Culture de uma requisição com data

Fazer uma aplicação web que funcione para vários idiomas e linguagens exige que pensemos em vários detalhes que normalmente temos como certo: o idioma do usuário separa os números com ponto ou vírgula? As datas são normalmente representadas de que forma? 01/11/2015 é Janeiro ou Novembro? Esses são alguns detalhes que precisam ser lembrados logo no início de uma aplicação que suporte Localization (L10n) e Internationalization (i18n).

Um problema que já vi acontecer várias vezes e que passa despercebido por alguns desenvolvedores é relacionado ao formato da data de uma requisição no ASP.NET MVC. Se o seu sistema possui uma tela em que o usuário pode definir vários filtros e fazer uma pesquisa, qual será o resultado de uma requisição que contenha um filtro de DataEntrada com o valor 01/11/2015?

Então, depende.

Essa resposta não parece ser satisfatória, né? Mas dessa vez vai fazer sentido. Se o usuário for brasileiro ele espera um relatório com os dados começando a partir de 01 de Novembro de 2015, certo? O problema, para você desenvolvedor, é que o resultado vai variar dependendo de onde o ModelBinder do MVC puxou os dados.

O ModelBinder do MVC

Até o MVC 5, o ModelBinder procura os valores do seu modelo na seguinte ordem:
1. Form data
2. Route values
3. Query strings

Se você fizer uma requisição POST e enviar os dados por Form Data, você terá o valor “01 de Novembro de 2015”, como esperado:

curl -X POST --data "dataEntrada=01/11/2015" https://seusite.com.br/Hoteis/Pesquisar

MVC data form data

Agora, fazendo a requisição passando o parâmetro por Query String (ou Route Value) teremos o valor “11 de Janeiro de 2015”:

curl https://seusite.com.br/Hoteis/Pesquisar?dataEntrada=01/11/2015

MVC data query string

O mais preocupante desse erro é que ele pode não ser notado se você rodar o código numa data ambíguia, como 10/10/2015. Mas por que isso acontece? A explicação é bem simples.

Fazendo sentido

Imagine que você acabou de fazer uma pesquisa com todos os hotéis disponíveis para a data 01/11/2015, para você, brasileiro, isso é Novembro, então você pega o link gerado pela pesquisa e envia para seu amigo norte-americano. Agora pense na confusão que seria se MVC retornasse uma consulta diferente para ele simplesmente porque ele utiliza um navegador com o idioma inglês. Ninguém iria querer isso, por isso o MVC decidiu que todo valor extraído do Route Value ou Query String será sempre processado com a cultura invariante, ou, em código CultureInfo.InvariantCulture. Você pode conferir isso aqui e aqui (♥ código aberto).

Você sempre deve esperar valores vindo com cultura invariante de parâmetros vindo da Query String, isso vale para todos os tipos de dados que podem sofrer variação, como datas e números decimais. É uma sacada simples e que você nunca mais se esquecerá, mas que pode ser difícil de perceber da primeira vez.

Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someone
Tags

Comments

Leave a Comment