2010-09-03 43 views
1

我得到了一些麻烦结合从查询字符串日期:ASP.NET MVC2:通过HTTP的DateTime modelbinding GET

我有以下型号

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

而下面的控制器操作:

public ActionResult Search(QueryParms query); 

我有一个窗体,有一个字段,我可以键入我的日期。如果表单是FormMethod.Post,一切都很好,我的日期正确地绑定到我的模型。

如果窗体是FormMethod.Get,它不再工作。日期保留为默认值(01/01/0001)

我认为这是一个文化问题: 当我查看值提供程序时,FormValueProvider为我的日期设置了文化属性:{fr- FR}。 QueryStringValueProvider没有设置文化属性。

有没有办法设置这个属性?

回答

1

这似乎是由设计:

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

,溶液(来自:CultureInfo issue with Modelbinding double in asp.net-mvc(2))是写一个新的模型绑定:

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]); 
    } 
}