我自己曾经遇到过这个非常棘手的问题,在尝试了数个小时后终于得到了像你所要求的工作解决方案。
首先需要说明的是,由于仅在属性上设置绑定器并不可行,您必须实现一个完整的ModelBinder。 由于您只想绑定特定的单个属性,而不是所有属性,因此可以从DefaultModelBinder继承,然后将单个属性绑定:
public class DateFiexedCultureModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.PropertyType == typeof(DateTime?))
{
try
{
var model = bindingContext.Model;
PropertyInfo property = model.GetType().GetProperty(propertyDescriptor.Name);
var value = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
if (value != null)
{
System.Globalization.CultureInfo cultureinfo = new System.Globalization.CultureInfo("it-CH");
var date = DateTime.Parse(value.AttemptedValue, cultureinfo);
property.SetValue(model, date, null);
}
}
catch
{
}
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
}
在我的示例中,我正在使用固定的区域设置解析日期,但你想要做的是可能的。你应该创建一个自定义属性(类似于DateTimeFormatAttribute),并将其放在你的属性上方:
[DateTimeFormat("d.M.yyyy")]
public DateTime Birth { get; set,}
在BindProperty方法中,不再查找DateTime属性,而是查找带有DateTimeFormatAttribute的属性,获取您在构造函数中指定的格式,然后使用DateTime.ParseExact解析日期。
希望这可以帮助你,我花了很长时间才想出这个解决方案。一旦知道如何搜索,实际上很容易得到这个解决方案 :(