在HTTP GET中绑定en-GB日期

本文关键字:en-GB 日期 绑定 HTTP GET | 更新日期: 2023-09-27 18:28:44

我和Dates在一起做噩梦。我们的总部设在英国,所以我们的日期格式是dd/MM/yyyy。这是用户在想要某个日期时将在表单中键入的内容。我有一个接受这样一个财产的表格。它显然是DateTime类型。我想在GET中将此表单发送到控制器,这样用户就有了一个很好的URL,他们可以保存传递等。视图还需要将JQuery UI日期选择器绑定到此元素。我还需要表单元素有一个特定的id和类,所以我真的需要将其呈现给表单,因此:

@Html.TextBoxFor(model => model.ReturnDate, new { Class = "date", id = "ReturnDate" })

我在web.config中指定了一个英国文化变体:

<globalization uiCulture="en" culture="en-GB"/>

不过,正如这里所解释的那样(http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx)当得到一个控制器时,MVC忽略了区域性变体并默认为美国(显然在美国以外没有人存在,所以这对微软来说很好,咆哮)。附件没有帮助,因为这意味着我必须为每个模型中的每个日期设置这个

这意味着,如果用户键入2012年5月1日,我最终会得到2012年1月5日,这是错误的!

我已经考虑过这个问题的各种解决方案,但没有一个真正符合我的需求。我需要一种方法,使通过GET发送的所有日期都是英国格式。我们仅以英国为基地,因此不会输入任何英国格式。

我真的不想创建和编辑,除非它们是我可以在没有View/Viewmodel附加到该编辑器的情况下完成这项工作的一种方式,因为在我们有日期选择器的任何地方使用它都会很困难。

我们将感激所有的帮助!

在HTTP GET中绑定en-GB日期

找到了一个解决方案,感谢@Jon的指针:

public class GBDateModelBinder : IModelBinder
{
    #region IModelBinder Members
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string dateString = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName];
        if (string.IsNullOrEmpty(dateString))
                 dateString = controllerContext.HttpContext.Request.Form[bindingContext.ModelName];
        DateTime dt = new DateTime();
        bool success = DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt);
        if (success)
        {
            return dt;
        }
        else
            {
            return null;
        }
    }
    #endregion
}

然后在global.asax:中注册

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder());

更新

修改了这一点,以允许在发布时出现相同的问题!

除了Liam的答案:

对于那些仍然存在此问题(!)并试图绑定到可为null的DateTime的人,请确保在global.asax:中注册正确的类型

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder());

让我被绊倒了15分钟!