我有一个MVC 5项目,其中有一个大表单,使用以下序列化为Knockout:
var vm = ko.mapping.fromJS(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)));
某些表单字段是使用jQuery-ui-datepicker的文本框,用户可以在其中选择日期:
@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#可以为空的DateTime映射到KnockoutJS时,我对幕后发生的事情感到困惑。是否存在针对此类问题的典型MVC或Knockout解决方案?
答案 0 :(得分:0)
我解决这个问题的方式使用Razor,所以它有点狡猾,但它确实有效。
在后台,这是一个很大的形式,它是从@Html.TextBoxFor
所在的几个部分视图动态生成的。当ViewModel为空(用户填写新表单)时,没有问题。如果ViewModel 不是为空(用户正在阅读提交的表单),则日期格式不正确。在SythnetP's suggestion,KnockoutJS的数据绑定可能会覆盖C#格式化规则。
似乎有一些使用Knockout的解决方案,但我决定让模型在是否代表" new"形式与#34; old"之一。
此外,我通过添加一些字符串使ViewModel更多 viewmodel-ey :
public string FormattedModelDate { get; set; }
...填充了"短日期格式"创建ViewModel时的DateTimes。
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
}
}
答案 1 :(得分:0)
注释您的viewmodel
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? SomeDate { get; set; }
这将在您的视图中应用您的格式。