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; }
这将在您的视图中应用您的格式。
我有一个 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 不 为空(用户正在阅读提交的表单)时,日期格式不正确。
似乎有一些使用 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; }
这将在您的视图中应用您的格式。