2010-09-03 8 views
1

Je reçois quelques problèmes se lier à une date à partir QueryString:ASP.NET MVC2: DateTime modelbinding via HTTP GET

je le modèle suivant

public class QueryParms 
{ 
    public DateTime Date { get; set; } 
} 

Et l'action du contrôleur suivant:

public ActionResult Search(QueryParms query); 

J'ai un formulaire, avec un champ où je peux taper ma date. Si le formulaire est FormMethod.Post, tout va bien, ma date est correctement liée à mon modèle.

Si le formulaire est FormMethod.Get, il ne fonctionne plus. La date est laissée à la valeur par défaut (01/01/0001)

Je pense que c'est un problème de culture: Quand je regarde dans le fournisseur de valeur, le FormValueProvider a un jeu de propriétés de culture pour ma date: {fr- FR}. Le QueryStringValueProvider n'a pas l'ensemble de propriétés de culture.

Existe-t-il un moyen de définir cette propriété?

Répondre

1

Cela semble être par la conception:

http://www.pagedesigners.co.nz/2009/12/asp-net-mvc-datetime-binding-and-culture-unaware-urls/

Et la solution (à partir de: CultureInfo issue with Modelbinding double in asp.net-mvc(2)) est d'écrire un nouveau modèle de liaison:

public class DateTimeModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var culture = GetUserCulture(controllerContext); 

     string value = bindingContext 
      .ValueProvider 
      .GetValue(bindingContext.ModelName) 
      .ConvertTo(typeof(string)) as string; 

     if (string.IsNullOrEmpty(value)) 
     { 
      return null; 
     } 

     return DateTime.Parse(value, culture.DateTimeFormat); 
    } 

    public CultureInfo GetUserCulture(ControllerContext context) 
    { 
     var request = context.HttpContext.Request; 
     if (request.UserLanguages == null || request.UserLanguages.Length == 0) 
      return CultureInfo.CurrentUICulture; 

     return new CultureInfo(request.UserLanguages[0]); 
    } 
}