![](/img/trans.png)
[英]Date stored in DataBase as NULL is returned as 01/01/1900 and not as DateTime.MinValue
[英]Html.TextBoxFor value for datetime.minvalue always turns into 01/01/2001 or disappears
我有一個用於在搜索表單中設置日期范圍的表單,如下所示:
<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
。 從這篇文章中,我認為由於Datepicker
似乎不理解這一點,它對4位數的年份存在一些奇怪的誤解。 所以我測試了這個:
$("#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"]);
當用戶未設置任何值或頁面加載時,將使用默認值As DateTime
。 我希望它在DateTime
等於默認值(即MinValue
)時不顯示任何形式。 並在選擇或發送任何日期時顯示正確的值。
更新:
我決定放一些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
助手。
切勿在第三方庫(例如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);
})();
如果希望DateRangeStart
在用戶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" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.