Passer un DateTime au controller via une URL provoquant une erreur ASP.NET MVC 3 (culture)
ma demande est réglée avec la culture pt-BR (la Date est JJ-mm-AAAA) sur le web.config:
<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" />
Tous les DateTime créé sur mon système est dans le bon format, mais j'ai créé une méthode de contrôleur comme ça:
public ActionResult Test(DateTime date)
{
}
appeler cette méthode directement dans le navigateur passe null quand la date est au format Portugais-br, comme ça:
mysite/Test/?date=19/01/2012 => date = null in my controller
mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy)
Comment puis-je corriger cela, pour accepter mon format de date?
4 réponses
il y a un gotcha avec le binder de model par défaut qui n'est pas facile à connaître mais une fois que vous le savez vous ne faites plus la même erreur:
lorsque vous utilisez une requête POST, le binder model par défaut utilise vos paramètres de culture pour analyser les dates.
lorsque vous utilisez une requête GET, le binder model par défaut utilise
CultureInfo.InvariantCulture
pour analyser les dates et ignorer vos paramètres de culture actuels.
puisque vous utilisez un GET demander et passer la date comme paramètre de chaîne de requête, vous devez la formater en utilisant le format de culture invariant lors de l'envoi dans l'url. La bonne façon de formater votre date comme paramètre de chaîne de requête est yyyy-MM-dd
.
vous pouvez jeter un coup d'oeil à la suivant le billet de blog qui entre dans plus de détails.
Comme quelqu'un qui fait beaucoup de travail avec des sociétés américaines, j'ai eu beaucoup d'expérience avec les problèmes de la date.
mon meilleur conseil est de choisir un format non ambigu lors de la transmission.
dd-MMM-yyyy
et
yyyy-MM-dd
sont des paris sûrs, et seront analysés avec succès par DateTime.Parse (obj).
si changer le format de la date n'est pas une option, vous devriez regarder DateTime.ParseExact
, ce qui vous permet de spécifier la chaîne de format exacte que vous recherchez.
Une approche possible serait d'accepter la date en une chaîne, puis le manipuler dans le contrôleur de la bonne localisation/culture.
Eu le même problème à l'aide d'un @Html.Action(..)
dans une vue. Pour cette situation, il peut être résolu en mettant le DateTime
modèle:
public class MyModel
{
public DateTime Value {get;set;}
}
et dans la vue:
@Html.Action("MyAction", new { myModel })
Notez le new { }
autour de l'instance de MyModel
, par ici le DateTime
n'est pas converti en une chaîne de caractères. Cette solution ne fonctionne que pour Html.Action()
et Html.ActionLink()
ou Url.Action()
puisque MVC fait un myModel.ToString()
dans L'URL.