Html.TextBoxFors没有正确格式化可为空的DateTimes

时间:2015-03-18 20:13:09

标签: c# razor knockout.js asp.net-mvc-5 jquery-ui-datepicker

我有一个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解决方案?

2 个答案:

答案 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; }

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