在 HTTP GET 中绑定 en-GB 日期
Posted
技术标签:
【中文标题】在 HTTP GET 中绑定 en-GB 日期【英文标题】:Binding en-GB dates in a HTTP GET 【发布时间】:2012-03-22 11:30:15 【问题描述】:我正在与 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 会忽略文化变体并默认为美国(显然在美国以外没有人存在,所以这对微软来说很好,咆哮)附件没有帮助,因为这意味着我必须为每个模型中的每个日期进行设置!
这意味着如果用户输入 01/05/2012 我最终会输入 05/01/2012 这是错误的!
我已经查看了这个问题的各种解决方案,但没有一个真正适合我的需要。我需要一种方法,以便通过 GET 发送的所有日期都采用英国格式。我们完全位于英国,因此不会输入任何英国格式。
我真的不想创建和编辑器,除非它们是一种我可以在没有附加到此编辑器的视图/视图模型的情况下执行此操作的方式,因为在我们有日期选择器的任何地方使用它都会变得笨拙。
我们将不胜感激!
【问题讨论】:
您链接的帖子如何无法解决您的问题? 据我所知,我需要为每个查询字符串参数执行此操作吗? (bindingContext.HttpContext.Request.QueryString["theDate"];) 这不切实际。 如果你实现了自定义模型绑定器,它将影响日期在整个应用程序中进入应用程序的方式,包括查询字符串、表单数据、cookie 等 是的,你的权利,但我如何从 ModelBindingContext 中获取日期?包含的示例只是从查询字符串中获取日期。无论如何,我都想影响所有日期。 ModelBindingContext 有一个 ModelName 属性——你可以检查它,然后在任何你想找到具有相应名称的数据的地方查找,然后应用你喜欢的任何解析逻辑...... 【参考方案1】:得到了解决方案,感谢@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());
更新
修改了这个以允许在发布时出现同样的问题!
【讨论】:
我应该把这个 GBDateModelBinder : IModelBinder 类放在哪里? 没关系?这是一堂课。只要您可以在 globals.asax 中访问它并在您放置它的位置注册它。【参考方案2】:除了利亚姆的回答:
对于那些仍然遇到此问题 (!) 并尝试绑定到 Nullable DateTime 的用户,请确保在 global.asax 中注册正确的类型:
ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder());
让我难倒了 15 分钟!
【讨论】:
以上是关于在 HTTP GET 中绑定 en-GB 日期的主要内容,如果未能解决你的问题,请参考以下文章