【问题标题】:Binding to a TimeSpan property in Asp.NET MVC Core绑定到 Asp.NET MVC Core 中的 TimeSpan 属性
【发布时间】:2020-01-08 17:20:27
【问题描述】:

我有一个对象的 TimeSpan 属性,该属性使用 EF Core 绑定到 SQL Server 数据库中的时间值。我想在 ASP.NET Core 2.2 MVC 项目中的表单上输入一个输入,用户可以在其中输入一个时间值,例如“9:00 AM”并将其绑定到这个 TimeSpan 属性。 MVC 中的内置属性绑定不能很好地处理这个问题。有人可以提供示例代码来添加一种设置绑定到 TimeSpan 属性的方法,而无需手动接收和转换后控制器方法中的属性吗?

【问题讨论】:

    标签: binding asp.net-core-mvc


    【解决方案1】:

    一般来说,DisplayFormat 属性可以应用于您的属性:

    [DisplayFormat(DataFormatString = "{0:hh:mm tt}", ApplyFormatInEditMode = true)]
    public TimeSpan MyTimeSpan { get; set; }
    

    属性的ApplyFormatInEditMode 属性决定了该格式是否也将用于解析值。

    但是,您还必须在此处处理一些特定于 HTML5 的内容。默认情况下,TimeSpan 属性将呈现为“时间”类型的输入。哪些现代浏览器将替换为时间控件。它将针对用户进行本地化,允许在适当的情况下输入 12 小时和上午/下午。但是,此输入的值必须采用 ISO 格式:hh:mm:ss(24 小时制,无 AM/PM)。如果您将输入的值设置为9:00 AM 而不是09:00:00,则浏览器会将其视为null,并且控件将呈现为未设置任何值。

    此外,依赖特定的绑定格式不会为用户的输入差异留下空间。如果一个用户以 24 小时格式输入时间,当它到达服务器时绑定将失败,因为它不是预期的格式。您需要进行自定义客户端验证,以确保用户坚持使用适当的格式。

    最好的办法是简单地发送和接收 ISO (hh:mm:ss)。然后在客户端,您可以依赖浏览器控件和/或使用一些 JS 库逐步增强输入以进行时间输入。在后台,您将只处理 ISO 时间,但随后您可以呈现以用户为中心的本地化格式以供显示/输入。

    【讨论】:

    • 使用 很好地限制了用户输入有效值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多