【问题标题】: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 时间,但随后您可以呈现以用户为中心的本地化格式以供显示/输入。