【问题标题】:Html.TextBoxFors are not formatting nullable DateTimes properlyHtml.TextBoxFors 没有正确格式化可为空的 DateTimes
【发布时间】:2015-05-21 19:28:52
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过 m.ModelDate.ToShortDateString() 或者它可能必须是“0:dd”而不是单个 d
  • @SythnetP 我没有尝试过,这是一个非常好的主意,但我的大多数日期都是 Nullables,它们没有 ToShortDateString() 属性。
  • 我建议的唯一其他选择是检查它是否不为空,然后将其转换为 DateTime 或将其转换为 DateTime
  • @SythnetP 实际上,即使尝试 ToString() 也会导致错误:“模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。” .
  • 可能与覆盖它的数据绑定有关吗?注意到 @data_bind = "value: ModelDate" } 可能会显示您要显示的值?

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


【解决方案1】:

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

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

似乎有一些使用 Knockout 的解决方案,但我决定让模型在它代表“新”形式还是“旧”形式方面具有状态。

此外,我通过添加一些字符串使 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
    }
}

【讨论】:

    【解决方案2】:

    注释您的视图模型

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

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

    【讨论】:

    • 我没有在问题中提到这一点,但这没有用。我想我几乎尝试了String.format 的每一次迭代。
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多