Поле не является датой, даже если оно правильно

У меня есть DateTimes в модели:

    [DataType(DataType.DateTime)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:dd/MM/yyyy HH:mm}")]       
    public DateTime Start { get; set; }

    [DataType(DataType.DateTime)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:dd/MM/yyyy HH:mm}")]    
    public DateTime End { get; set; }

Если я пишу 25.05.2016 10:00, это говорит о том, что поле Начало/Конец не является датой, но если я пишу 12.05.2016 10:00, это правильно. Первое число соответствует дню (12), второе - месяцу (05), последнее - году (2016), 10 - часам и 00 - минутам, так почему я не могу написать день больше 12?


person Cezar    schedule 18.11.2016    source источник
comment
В вашем представлении, как вы отображаете текстовые поля? @Html.EditorFor(model => model.Start)?   -  person Grizzly    schedule 18.11.2016
comment
Используете ли вы средство выбора даты jQuery или какой-либо плагин? Или дату вручную пишете?   -  person Grizzly    schedule 18.11.2016
comment
я пишу вручную   -  person Cezar    schedule 18.11.2016
comment
Если это ошибка проверки на стороне клиента, вам необходимо перенастроить $.validator (см. >этот ответ). Если это ошибка проверки на стороне сервера, вам нужно установить культуру на ту, которая принимает формат dd/MM/yyyy, или создать собственный ModelBinder   -  person    schedule 18.11.2016
comment
Вам нужно предоставить больше информации о том, когда это происходит.   -  person    schedule 18.11.2016
comment
Я думаю, что это на стороне клиента (потому что он не переходит к HttpPost, если номер дня больше 12), но я не кодировал никаких валидаторов на стороне клиента. Если я напишу 12.05.2016, то 12 будет правильным днем, 05 — месяцем, а 2016 — годом, но валидатор не принимает день больше 12.   -  person Cezar    schedule 19.11.2016
comment
@Cezar, перенастройте $.validator для приема дат в формате dd/MM/yyyy по ссылке в моем предыдущем комментарии.   -  person    schedule 19.11.2016
comment
По ошибке я удалил загрузку скрипта jquery, поэтому у меня он работал, но я мог даже написать такой дадасдас, и он перешел бы в функцию POST.   -  person Cezar    schedule 19.11.2016
comment
Я нашел что-то подобное, и оно работает (единственная ошибка в том, что он принимает 30 и 31 февраля, но я думаю, что это не имеет большого значения) jQuery(function ($) { $.validator.addMethod( "date", function (value, element) { var dateReg = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[2][0]\d{2})$|^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[2][0]\d{2}\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$/; return value.match(dateReg); }, "Invalid date" ); });   -  person Cezar    schedule 19.11.2016


Ответы (4)


Вместо того, чтобы делать это непосредственно в классе, попробуйте сделать это в представлении.

@Html.EditorFor(model => model.Start, "{0:dd/MM/yyyy HH:mm}")

@Html.EditorFor(model => model.End, "{0:dd/MM/yyyy HH:mm}")

Затем в вашей модели просто выполните:

[DataType(DataType.DateTime)]      
public DateTime Start { get; set; }

[DataType(DataType.DateTime)]
public DateTime End { get; set; }

Позвольте мне знать, если это помогает!

person Grizzly    schedule 18.11.2016
comment
Не работает, конечно, первое число - это день правильно, но этот тупой валидатор не позволяет ему перейти к функции публикации, если день больше 12... - person Cezar; 18.11.2016
comment
@Cezar, значит, ошибка возникает, когда вы нажимаете «Отправить» или как только фокус покидает текстовое поле? - person Grizzly; 18.11.2016
comment
Я нажимаю «Создать», и он проверяет, правильно ли значение текстового поля, без перезагрузки страницы. - person Cezar; 18.11.2016
comment
@Cezar, значит, дело идет к действию [HttpPost]? И тогда он терпит неудачу на чем? Где возникает исключение? - person Grizzly; 18.11.2016
comment
Он переходит в HttpPost только тогда, когда первое число меньше 13. - person Cezar; 19.11.2016

То, что у вас есть здесь, в приведенном ниже коде, - это просто формат отображения.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:dd/MM/yyyy HH:mm}")]    

Формат даты и времени по умолчанию — ММ/дд/гггг ЧЧ:мм, поэтому на самом деле для даты и времени 12.05.2016 10:00, 12 — месяц, 05 — день и 2016 год.

C# применяет эту проверку, если вы пытаетесь установить дату в другом формате.

И цель формата отображения - отображать указанную дату в формате дд/мм/гггг.

person Michael Kovattil    schedule 18.11.2016
comment
Итак, как я могу изменить его, чтобы он работал так, как я хочу, чтобы он работал? Как я уже писал, первое число - это день, а не месяц, но это не позволяет мне установить день больше 12 (я проверил это, просмотрев свой объект DateTime в пост-контроллере) - person Cezar; 18.11.2016
comment
вам нужно сделать что-то вроде этого - person Michael Kovattil; 18.11.2016

DateTime dt=DateTime.ParseExact("24/01/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture); добавьте формат времени HH:mm, если вам нужна и эта информация.

person Michael Kovattil    schedule 18.11.2016
comment
Куда мне это положить? Напоминаю, что он не перейдет в функцию POST, если первое число больше 12. - person Cezar; 18.11.2016
comment
Я предполагаю, что вы пытаетесь опубликовать это, вы можете выполнить синтаксический анализ в файле cshtml. - person Michael Kovattil; 18.11.2016

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime Start { get; set; }

а это на ваш взгляд:

@Html.EditorFor(x => x.Start)

это должно работать.

person Michael Kovattil    schedule 18.11.2016
comment
Не работает, конечно, первое число - это день правильно, но этот тупой валидатор не позволяет ему перейти к функции публикации, если день больше 12... - person Cezar; 18.11.2016
comment
Можете ли вы опубликовать свой код cshtml здесь. Так что мы можем посмотреть и предположить, что пошло не так. - person Michael Kovattil; 18.11.2016