代码之家  ›  专栏  ›  技术社区  ›  mathieu

ASP.NETMVC2:通过httpget的DateTime模型绑定

  •  1
  • mathieu  · 技术社区  · 14 年前

    我在绑定QueryString的日期时遇到了一些问题:

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

    以及以下控制器操作:

    public ActionResult Search( QueryParms query );
    

    如果表格是FormMethod.获取,它不再工作了。日期保留为默认值(01/01/0001)

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community dbr    7 年前

    这似乎是出于设计:

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