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?

19
demandé sur Zanon 2012-01-18 16:59:19

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.

53
répondu Darin Dimitrov 2012-01-18 13:03:23

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.

8
répondu Paul Alan Taylor 2012-01-18 13:08:09

Une approche possible serait d'accepter la date en une chaîne, puis le manipuler dans le contrôleur de la bonne localisation/culture.

2
répondu Kevin Junghans 2012-01-18 13:05:12

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.

0
répondu Marthijn 2014-10-30 07:39:26