Html.TextBoxFors 没有正确格式化可为 null 的日期时间

Html.TextBoxFors are not formatting nullable DateTimes properly

我有一个 MVC 5 项目,其中有一个大表单,使用以下方法序列化为 Knockout:

var vm = ko.mapping.fromJS(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)));

一些表单字段是使用 jQuery-ui-datepicker 的文本框,用户可以在其中 select 日期:

@Html.TextBoxFor(m => m.ModelDate, "{0:d}", new { @class = "form-control", @data_bind = "value: ModelDate" })

我的问题是,如果 ViewModel 的可空 ModelDate 属性 包含 DateTime 值,文本框会显示类似 2014-04-05T18:00:00 的内容,但不会显示 04/5/2015。格式(例如 "{0:d}")将被忽略。

我不知道我的字符串格式参数被忽略了,而且当 ViewModel 中的 C# 可为 null 的 DateTime 映射到 KnockoutJS 时,我对幕后发生的事情感到困惑。是否有针对此类问题的典型 MVC 或 Knockout 解决方案?

我解决这个问题的方法是使用 Razor,所以它有点狡猾,但它有效。

在后台,这是一个大表单,它是从 @Html.TextBoxFor 所在的几个局部视图动态生成的。当 ViewModel 为空时(用户正在填写新表单),没有问题。当 ViewModel 为空(用户正在阅读提交的表单)时,日期格式不正确。 ,KnockoutJS 的数据绑定可能会覆盖 C# 格式化规则。

似乎有一些使用 Knockout 的解决方案,但我决定使模型有状态,以判断它是否表示 "new" 形式与 "old" 形式。

此外,我通过添加一些字符串使 ViewModel 更多 viewmodel-ey

public string FormattedModelDate { get; set; }

... 创建 ViewModel 时填充了 "short date formatted" 日期时间。

if (vm.ModelDate.HasValue)
{
    vm.FormattedModelDate = vm.ModelDate.Value.ToShortDateString();
}

最终结果是这样的:

@{
    if (Model.IsNewForm)
    {
        // display the Html.TextBoxFor m.ModelDate with the Knockout bindings 
    }  else {
        // display the Html.TextBoxFor m.FormattedModelDate without the Knockout bindings
    }
}

注释您的视图模型

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? SomeDate { get; set; }

这将在您的视图中应用您的格式。