web-dev-qa-db-fra.com

Passer un DateTime au contrôleur via une URL provoquant une erreur dans ASP .NET MVC 3 (culture)

Mon application est configurée avec la culture pt-BR (la date est jj-mm-aaaa) dans 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" />

Tout DateTime créé sur mon système est au bon format, mais j'ai créé une méthode de contrôleur comme celle-ci:

public ActionResult Test(DateTime date)
{
}

L'appel direct de cette méthode dans le navigateur est nul lorsque la date est au format portugais-br, comme celui-ci:

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 résoudre ce problème, pour accepter mon format de date?

19
Paul

Avec le classeur de modèles par défaut, il est difficile de le savoir, mais une fois que vous le savez, vous ne commettez plus la même erreur:

  • Lorsque vous utilisez une demande POST, le classeur de modèles par défaut utilise vos paramètres de culture pour analyser les dates.

  • Lorsque vous utilisez une demande GET, le classeur de modèle par défaut utilise CultureInfo.InvariantCulture pour analyser les dates et ignore vos paramètres de culture actuels.

Puisque vous utilisez une demande GET et transmettez la date en tant que paramètre de chaîne de requête, vous devez la formater en utilisant le format de culture invariant lors de son envoi dans l'URL. La méthode correcte pour formater votre date en tant que paramètre de chaîne de requête est yyyy-MM-dd.

Vous pouvez jeter un coup d'œil au article suivant du blog qui donne plus de détails.

54
Darin Dimitrov

En tant que personne qui travaille beaucoup avec des entreprises américaines, j'ai beaucoup d'expérience avec les problèmes de dates.

Mon meilleur conseil est de choisir un format sans ambiguïté 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 vous ne pouvez pas modifier le format de la date, consultez DateTime.ParseExact, qui vous permet de spécifier la chaîne de formatage exacte que vous recherchez.

9
Paul Alan Taylor

Une approche consisterait à accepter la date en tant que chaîne, puis à la manipuler dans le contrôleur pour obtenir les paramètres régionaux/culture appropriés.

2
Kevin Junghans

Vous avez le même problème en utilisant un @Html.Action(..) dans une vue. Pour cette situation, il peut être résolu en mettant la DateTime dans un 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, de cette manière, la DateTime n'est pas convertie en chaîne. Cette solution ne fonctionne que pour Html.Action() et not pour Html.ActionLink() ou Url.Action() puisque MVC effectue une myModel.ToString() dans l'URL.

0
Marthijn