2010-12-03 42 views
2

Mon application s'exécute sous les paramètres de culture ro-RO, configurés dans la section web.config globalisation. Si je fais une requête POST commeProblème de globalisation avec DateTime et ASP.NET MVC 3 Reliure de modèle

POST /myapp/index 
date=03-12-2010&value=something 

les cartes de liaison du modèle ce paramètre pour corriger la valeur de la date du "03 Décembre 2010", puisque le format datetime par défaut pour la culture ro-RO est dd-MM-AAAA. Si je change la méthode de requête GET passer les mêmes données, la valeur de date dans mon action devient "12 Mars 2010" (MM-JJ-AAAA format datetime)

GET /myapp/index?date=03-12-2010&value=something 

$.getJSON('/Home/Index', $('form').serialize(), function(d) { 
      // ... 
}); 
$.post('/Home/Index', $('form').serialize(), function(d) { 
      // ... 
}, 'json'); 

Donc dans ce cas "getJSON" & « post "doit retourner le même résultat, mais j'obtiens des résultats différents en raison de la différence de date/heure.

Comment puis-je activer le même format d'analyse pour les requêtes GET?

Je sais que je peux utiliser un format plus générique comme aaaa-MM-jj pour les dates, mais je suis juste curieux de savoir pourquoi cela se passe?

Répondre

13

De ma précédente réponse à ce sujet. Nullable DateTime Parameter is never bound when calling the action

"Ceci est intentionnel Tout ce qui fait partie de l'URI (notez le « uniforme » URI) est interprété comme si elle venait de la culture invariante C'est ainsi qu'un utilisateur américain qui copie un lien et l'envoie par messagerie instantanée à un ami au Royaume-Uni peut être sûr que son ami verra exactement la même page (par opposition à un HTTP 500 en raison d'une erreur de conversion DateTime , par exemple) En général, les dates passées dans RouteData ou QueryString doivent être au format aaaa-mm-jj de manière à être sans ambiguïté entre les cultures

Si vous devez interpréter un paramètre QueryString ou RouteData en tenant compte de la culture, placez-le sous forme de chaîne, puis convertissez-le manuellement en le faisant passer dans la culture souhaitée. (DateTime.Parse a des surcharges qui vous permettent de spécifier une culture.) Si vous faites cela, je recommande également de prendre la culture souhaitée en tant que paramètre QueryString ou RouteData afin que la partie 'Uniform' de l'URI ne soit pas perdue, par ex. l'URL ressemblera à quelque chose comme ...? culture = fr-fr & date = 01-10-1990. "