Html.TextBoxFor datetime.minvalue的值始终变为01/01/2001或消失

时间:2018-05-12 02:27:40

标签: c# jquery .net asp.net-core jquery-ui-datepicker

我有一个表单,用于在搜索表单中设置日期范围,如下所示:

<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有关。从this帖子开始,我认为它有一些奇怪的误解,因为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)时,我希望它不会在表单中显示任何内容。并且在使用模型挑选或发送任何日期时显示正确的值。

更新

我决定在01/01/2001时删除一些JavaScript行来删除值,这让我意识到,即使它显示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 :(得分:0)

切勿将最小值或任何其他任意值与第三方库(例如jQuery)一起使用以指示数据不存在。你不知道图书馆如何处理这个价值,即使你这样做,你也不能保证它将来不会改变并破坏你的代码。要指示缺少数据,请使用适当的机制(在许多语言中为null)。在C#中,使用可为空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" />