在HTTP GET中绑定en-GB日期

时间:2012-03-22 11:30:15

标签: c# asp.net-mvc asp.net-mvc-3 date culture

我和Dates度过了一段噩梦。我们的总部设在英国,因此我们的日期格式为dd / MM / yyyy。这是用户在需要特定日期时将在表单中键入的内容。我有一个表格只接受这样的财产。它显然是一个DateTime类型。我想在GET中将此表单发送到控制器,因此用户有一个很好的URL,他们可以保存传递,等等。视图还需要将JQuery UI datepicker绑定到此元素。我还需要表单元素具有一定的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忽略了文化变体并且默认为美国(显然没有人存在于美国以外,所以这对微软来说没什么问题,咆哮附件没有帮助,因为这意味着我必须为每个模型中的每个日期设置它!

这意味着如果用户输入01/05/2012,我最终会遇到05/01/2012,这是错误的!

我已经看过这个问题的各种解决方案,但没有一个真正符合我的需要。我需要一种方法,以便通过GET发送的所有日期都是英国格式。我们完全位于英国,因此不会输入任何英国格式。

我真的不想创建和编辑,除非他们可以在没有附加到此编辑器的View / Viewmodel的情况下执行此操作,因为在我们有日期选择器的任何地方使用它都会非常困难。

感谢所有帮助!

2 个答案:

答案 0 :(得分:10)

得到了一个解决方案,感谢@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());

<强>更新

修改此项以在POST时允许相同的问题!

答案 1 :(得分:2)

除了利亚姆的回答:

对于那些仍然遇到此问题(!)并尝试绑定到Nullable DateTime的人,请确保在global.asax中注册了正确的类型:

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

让我难倒了15分钟!