Дата по умолчанию jQuery datepicker нулевая при обратной передаче

У меня есть модель, которая выглядит так:

public class RegisterResultAdminModel
{
    [DateInThePastValidator(ErrorMessage = "Date needs to be a valid date set in the past.")]
    [Required(ErrorMessage = "You need to set Date.")]
    public DateTime DatePlayed { get; set; }
}

Мой валидатор выглядит так:

public class DateInThePastValidator : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var date = (DateTime)value;
        if (date > DateTime.UtcNow)
            return false;
        return true;
    }
}

Я установил DatePlayed в DateTime.Today в методе Index моего контроллера:

...
model.DatePlayed = DateTime.Today;
return View(model);

В моем Index.cshtml у меня есть следующий код:

@model Web.Models.RegisterResultAdminModel
...
<p>@Html.TextBoxFor(m => m.DatePlayed, new { @Value = Model.DatePlayed, id = "datepicker" })</p>
...
<script>
$(function() {
    $("#datepicker").datepicker({ dateFormat: 'dd-MM-yy'});
});
</script>

TextBoxFor находится внутри Html.BeginForm.

Хорошо, готовлюсь к моей проблеме сейчас. При отображении страницы дата отображается как 14.09.2017 00:00:00. Справедливо. Но когда я нажимаю «Отправить», валидатор показывает значение как нулевое (я вижу это в отладчике). Однако, если я сначала нажму на средство выбора даты, а затем выберу дату, она отобразится как 14-September-2017. Теперь, когда я нажимаю «Отправить», валидатор принимает дату (теперь отладчик показывает дату), и все остальное работает нормально.

Есть много статей по, казалось бы, очень похожим вопросам, но я, должно быть, упускаю что-то очевидное.

Как я могу заставить это работать?

Изменить: добавление пояснения к параметру "отображается как нуль"


person Halvard    schedule 14.09.2017    source источник
comment
Не связано, но удалите бессмысленный new { @Value = Model.DatePlayed } и НИКОГДА не пытайтесь переопределить атрибут value при использовании методов HtmlHelper.   -  person    schedule 14.09.2017
comment
Не совсем понятно, о чем вы спрашиваете. Что вы имеете в виду, валидатор показывает значение как null? Ваше свойство DateTime, и если бы оно было null, вы бы сначала получили другую ошибку. И вы отправляете дату в формате, который не соответствует культуре вашего сервера, поэтому она все равно не может быть привязана   -  person    schedule 14.09.2017
comment
model.DatePlayed = DateTime.Today; › model.DatePlayed = DateTime.Now;   -  person Animus Miles-Militis    schedule 14.09.2017
comment
@StephenMuecke Удаление «@Value= Model.DatePlayed» устранило проблему. Теперь в отладке вижу дату. Может быть, вам следует опубликовать это как ответ?   -  person Halvard    schedule 14.09.2017
comment
Есть несколько других ваших утверждений, которые не имеют смысла (или я их не понял). И в качестве примечания, вы можете использовать @Html.TextBoxFor(m => m.DatePlayed, "{0:dd-MMMM-yyyy}", new { id = "datepicker" }) для форматирования начального дисплея. НО мне нужно немного поспать, так что не стесняйтесь добавлять свой собственный ответ.   -  person    schedule 14.09.2017
comment
@ AnimusMiles-Militis Разве DateTime.Today не является сегодняшней датой минус часы и минуты? И, следовательно, DateTime.Now › DateTime.Today?   -  person Halvard    schedule 14.09.2017
comment
Вам нужно установить значение, если вы привязываетесь? @Value = Model.DatePlayed   -  person Animus Miles-Militis    schedule 18.09.2017
comment
@AnimusMiles-Militis Нет, на самом деле это было неправильно и привело к другим проблемам. Это было указано Стивеном Мюке выше. Я предложил ему опубликовать это как ответ.   -  person Halvard    schedule 20.09.2017


Ответы (1)


Просто чтобы это получило ответ, так как есть правильный:

Стивен Мюке правильно указал, что я не должен устанавливать new { @Value = Model.DatePlayed }. Мои проблемы с форматом даты исчезли, когда я использовал его второе предложение:

Html.TextBoxFor(m => m.DatePlayed, "{0:dd-MMMM-yyyy}", new { id = "datepicker" })

После этого все просто работает. Так что спасибо за помощь!

person Halvard    schedule 21.09.2017