Значение Html.TextBoxFor для datetime.minvalue всегда превращается в 01/01/2001 или исчезает - PullRequest
0 голосов
/ 12 мая 2018

У меня есть форма для установки диапазона дат в форме поиска, например:

<div>
    @Html.LabelFor(m => m.DateRangeStart)
    @Html.TextBoxFor(m => m.DateRangeStart, "{0:dd-MM-yyyy}", new { @id = "drs" })

    @Html.LabelFor(m => m.DateRangeEnd)
    @Html.TextBoxFor(m => m.DateRangeEnd, "{0:dd-MM-yyyy}", new { @id = "dre" })
</div>

Поскольку я использую c # Razor MVC, DateTime значение по умолчанию - 01/01/0001 00:00:000.000. Тем не менее, когда модель поставляется с этим значением, форма показывает 01/01/2001.

Я подозреваю, что это связано со стилем, помимо того, что изображено, я попробовал {0:d} и многих комбинаций, похожих на показанную. Иногда значение просто удаляется из формы. Я действительно не могу понять, как это работает.

Я также думаю, что это связано с jQuery datepicker. Из этого поста я предполагаю, что в нем есть какое-то странное недоразумение с 4-значными годами, поскольку Datepicker, похоже, этого не понимает. Итак, я проверил это:

$("#drs").datepicker({ dateFormat: 'dd/mm/yy' });
$("#dre").datepicker({ dateFormat: 'dd/mm/yy' });

это:

$("#drs").datepicker({ dateFormat: 'dd/mm/yyyy' });
$("#dre").datepicker({ dateFormat: 'dd/mm/yyyy' });

со странным результатом использования 8-значных лет, дублирующих его как 20182018. Использование yy показывает 4 цифры года, но превращает 0001 в 2001.

И первоначальная конфигурация была:

$("#drs").datepicker($.datepicker.regional["es"]);
$("#dre").datepicker($.datepicker.regional["es"]);

Как DateTime значение по умолчанию используется, когда пользователь не установил никакого значения или при загрузке страницы. Мне бы хотелось, чтобы в форме ничего не отображалось, когда DateTime равно значению по умолчанию (то есть MinValue). И показывает правильное значение, когда любая дата выбрана или отправлена ​​вместе с моделью.

UPDATE:

Я решил добавить несколько строк JavaScript, чтобы стереть значения, когда оно равно 01/01/2001, и это заставляет меня понять, что, хотя оно показывает 01/01/2001, действительное значение равно 01/01/0001:

if ($("#drs").val() == "01/01/0001")
  $("#drs").val("");

Когда я впервые написал if ($("#drs").val() == "01/01/2001") значение условия в false, потому что значение было на самом деле 01/01/0001.

ОБНОВЛЕНИЕ 2:

Я по ошибке удалил часть заголовка. Спасибо, ребята, за комментарии и заставьте меня понять это. Проблема в использовании Html.Textboxfor помощника.

1 Ответ

0 голосов
/ 12 мая 2018

Никогда не используйте минимальное значение или любое другое произвольное значение в сторонней библиотеке (например, jQuery), чтобы указать на отсутствие данных.Вы не знаете, как библиотека обрабатывает это значение, и даже если вы это делаете, у вас нет никаких гарантий, что это не изменится в будущем и не нарушит ваш код.Чтобы указать на отсутствие данных, используйте подходящий механизм (во многих языках null).В C # используйте nullable DateTime? вместо DateTime, и вы получите значение по умолчанию как null вместо минимального значения даты.

В вашем сценарии я не рекомендую использовать TextBoxForпоскольку Datepicker контролирует текстовое поле, просто используйте вместо него HTML input:

<input type="text" id="drs" name="drs" readonly="readonly" />

И присвойте значение Datepicker, используя метод SetDate():

(function () {
    var date = '@(Model.DateRangeStart.HasValue? Model.DateRangeStart.ToString("dd/MM/yyyy") : "null")';
    $("#drs").datepicker({ dateFormat: "dd/mm/yy" }).datepicker("setDate", date);
})();

Если вы хотите, чтобы Datepicker автоматически обновлял ваше поле DateRangeStart при выборе даты пользователя, вы можете использовать свойство altField.И если вам нравится отображать дату в другом формате, чем тот, который может принять C #, вы можете использовать свойство altFormat:

(function () {
    var date = '@(Model.DateRangeStart.HasValue? Model.DateRangeStart.ToString("dd/MM/yyyy") : "null")';
    $("#drs").datepicker({
        dateFormat: "dd/mm/yy",
        altFormat: "yy-mm-dd",
        altField: "#@Html.IdFor(m => m.DateRangeStart)",
    }).datepicker("setDate", date);
})();

В этом случае вы делаете DateRangeStart скрытым полем, потому чтовы используете только его значение, которое будет отправлено вместе с формой вашему контроллеру.Поле drs отображает дату для пользователя:

@Html.HiddenFor(m => m.DateRangeStart);
<label for="drs">@Html.DisplayNameFor(m => m.DateRangeStart)<label>
<input type="text" id="drs" name="drs" readonly="readonly" />
...