2010-11-30 5 views
1

DateTime qui vient de POST est binded correctement (selon le format de mon ordinateur)DateTime qui vient d'une requête GET utilise un format différent de celui qui vient de POST

mais les valeurs DateTime qui viennent de GET ne lier correctement, il utilise un format différent

my format is dd.MM.yyyy, in GET it uses MM.dd.yyyy instead 

I don't have this problem if I use the en-US format (which is MM/dd/yyyy) 

quelqu'un sait comment résoudre ce problème?

est-ce un bug de mvc? (il ne considère pas la culture lors de la liaison obtenir des demandes)

+0

Avez-vous testé l'application à partir de plusieurs navigateurs pour voir si le comportement est constant? – rjzii

+0

@Rob, non je n'ai pas, mais je le ferai, thnx pour la suggestion – Omu

Répondre

8

Non, il semble que ce n'est pas un bug. Vous pouvez obtenir plus de détails ici: MVC DateTime binding with incorrect date format

J'ai utilisé le ModelBinder suivant pour résoudre ce problème.

public class CurrentCultureDateTimeBinder : IModelBinder 
{ 
    private const string PARSE_ERROR = "\"{0}\" is not a valid date"; 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (valueProviderResult == null) return null; 

     var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue; 

     if (String.IsNullOrEmpty(date)) 
      return null; 

     bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName)); 

     try 
     { 
      return DateTime.Parse(date); 
     } 
     catch (Exception) 
     { 
      bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format(PARSE_ERROR, bindingContext.ModelName)); 
      return null; 
     } 
    } 
} 

Espérons que cela aide.

+0

pas sûr pourquoi, mais ça aide – Omu

+1

@Omu Cela fonctionne parce que DateTime.Parse (String) utilise la culture de fil en cours (rendant le classeur Culture conscient). En revanche, le classeur par défaut utilise CultureInfo.InvariantCulture. Vous pouvez voir plus de détails ici: http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx – CGK

Questions connexes