绑定(bind)到 Asp.NET MVC Core 中的 TimeSpan 属性

标签 binding asp.net-core-mvc

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

最佳答案

一般来说,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 相同,并且该控件将呈现为未设置任何值。

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

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

关于绑定(bind)到 Asp.NET MVC Core 中的 TimeSpan 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57811690/

相关文章:

c# - 单击按钮时wpf命令未执行的问题

silverlight - 清除 MVVM ViewModel 中的数据网格

wpf - 如何在 CellTemplate 中为 DataTemplate 设置特定的 Datacontext

asp.net - HttpContext 不包含 SignOutAsync 的定义

c# - 具有 DbContext 的单例 - 在 Startup.cs 中创建实例

json - 未使用 json 数据完成绑定(bind)

WPF,XAML : How to style a ListBoxItem using binding on property of ListBox ItemsSource object?

asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelpers

javascript - 使用内置功能在 MVC6 中使用 JQuery AJAX 提交 Razor 表单

asp.net-mvc - MVC 5 或 MVC 6 适合 MVC 初学者