У меня была эта очень большая проблема, и после нескольких часов попыток и неудач я получил рабочее решение, как вы и просили.
Прежде всего, поскольку привязка только к свойству невозможна, вам необходимо реализовать полный 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
{
//If something wrong, validation should take care
}
}
else
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
}
В моем примере я разбираю свидание с жестокой культурой, но то, что вы хотите сделать, возможно. Вы должны создать CustomAttribute (например, DateTimeFormatAttribute) и поместить его в свое свойство:
[DateTimeFormat("d.M.yyyy")]
public DateTime Birth { get; set,}
Теперь в методе BindProperty вместо поиска свойства DateTime вы можете искать свойство с вашим DateTimeFormatAttribute, получить формат, указанный в конструкторе, а затем проанализировать дату с помощью DateTime.ParseExact
Надеюсь, это поможет, у меня ушло очень много времени, чтобы прийти с этим решением. Было действительно легко получить это решение, когда я знал, как его искать: (