Почему я получаю ошибку проверки dateFormat
Я использую ASP.NET MVC 4 с Razor. Я получаю сообщение проверки (допустим, у меня есть 20.10.2013 в моем текстовом поле):
The field MyNullableDateField must be a date
Код моей модели:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime? MyNullableDateField { get; set; }
Моя бритва:
@Html.EditorFor(m => m.MyNullableDateField, new { @class = "date" })
Мой редактор шаблонов:
@model DateTime?
@Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "date" })
Почему я получаю такую ошибку?
1 ответ
Андрей,
Форматы отображения в основном для использования помощников HTML, которые вы используете в представлении.
Что вам нужно (как правильно упомянуто @CodeCaster), это пользовательское связующее для модели типа DateTime. Пользовательские привязки модели могут быть зарегистрированы для каждого типа, поэтому всякий раз, когда среда выполнения MVC видит аргумент для действия контроллера того же типа, она вызывает пользовательский связыватель модели для правильной интерпретации опубликованных значений и создания типа.
Ниже приведен пример типа привязки пользовательской модели для DateTime.
public class DateTimeModelBinder : DefaultModelBinder
{
private string _customFormat;
public DateTimeModelBinder(string customFormat)
{
_customFormat = customFormat;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
// use correct fromatting to format the value
return DateTime.ParseExact(value.AttemptedValue, _customFormat, CultureInfo.InvariantCulture);
}
}
Теперь вам нужно будет указать MVC, чтобы вы использовали новую модель Binder для DateTime. Вы можете сделать это, зарегистрировав связыватель новой модели на Application_Start
protected void Application_Start()
{
//tell MVC all about your new custom model binder
var binder = new DateTimeModelBinder("dd.MM.yyyy");
ModelBinders.Binders.Add(typeof(DateTime), binder);
ModelBinders.Binders.Add(typeof(DateTime?), binder);
}
Авторы благодарны этой замечательной статье о привязке пользовательской модели для даты и времени ( http://blog.greatrexpectations.com/2013/01/10/custom-date-formats-and-the-mvc-model-binder/)
Надеюсь, что это поможет вам начать правильную часть