C# Html.TextBoxFors未正确格式化可为空的日期时间

C# Html.TextBoxFors未正确格式化可为空的日期时间,c#,razor,knockout.js,asp.net-mvc-5,jquery-ui-datepicker,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-con

我有一个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的nullable ModelDate属性包含DateTime值,则文本框会显示类似2014-04-05T18:00:00的内容,而不是2015年4月5日。忽略格式设置,例如{0:d}


我不知道我的字符串格式参数被忽略了,我对ViewModel中的C nullable DateTime映射到KnockoutJS时幕后发生的事情感到困惑。有没有一个典型的MVC或淘汰方案来解决这类问题?

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

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

似乎有一些使用Knockout的解决方案,但我决定让模型有状态地表示新表单与旧表单

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

public string FormattedModelDate { get; set; }
。。。在创建ViewModel时,将使用短日期格式的日期时间填充

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
    }
}

为viewmodel添加注释

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

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

您是否尝试过m.ModelDate.toSortDateString,或者它可能必须是0:dd而不是singled@SythnetP我没有试过,这是个好主意,但我的大多数约会都是可空的,我建议的唯一其他选项是检查它是否为null,然后将其转换为日期时间或将其转换为DateTime@SythnetP实际上,即使尝试字符串也会导致错误:模板只能用于字段访问、属性访问、一维数组索引、,或者单参数自定义索引器表达式..它可能与覆盖它的数据绑定有关吗?注意到@data_bind=value:ModelDate}可能会在您试图显示的内容上显示值?我在问题中没有提到这一点,但这不起作用。除此之外,我还尝试了String.format的每一次迭代。