我有一个表单,用于在搜索表单中设置日期范围,如下所示:
<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
帮助程序。
答案 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" />