ASP.NET MVC2:通过HTTP GET进行DateTime模型绑定

时间:2010-09-03 09:47:33

标签: asp.net-mvc-2 internationalization modelbinders

我在从QueryString绑定日期时遇到了一些麻烦:

我有以下型号

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

以下控制器操作:

public ActionResult Search( QueryParms query );

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

如果表单是FormMethod.Get,它将不再起作用。日期保留为默认值(01/01/0001)

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

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

1 个答案:

答案 0 :(得分: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]);
    }
}