簡體   English   中英

Html.TextBoxFor datetime.minvalue的值始終變成01/01/2001或消失

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM