我在一个对象上有一个
TimeSpan
属性,该属性使用 EF Core 绑定到 SQL Server 数据库中的时间值。我希望在 ASP.NET Core 2.2 MVC 项目中的表单上进行输入,用户可以在其中输入时间值(例如“9:00 AM”)并将其绑定到此 TimeSpan
属性。 ASP.NET Core MVC 中的内置属性绑定不能很好地处理这个问题。
有人可以提供示例代码来添加一种设置绑定到
TimeSpan
属性的方法,而无需在后控制器方法中手动接收和转换属性吗?
一般来说,可以将
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 时间,但随后您可以呈现一种以用户为中心的本地化格式用于显示/输入。