剃须刀页面中的日期选择器始终显示为空白

Datepicker in razor pages always appears blank

这是一件看似简单的事情,但我还没有把它付诸实践。我正在构建一个简单的文件上传表单,我想要一个上传日期字段。我做了模型,我想保存日期和时间:

[DataType(DataType.DateTime)]
public DateTime DateUploaded { get; set; }

然后在视图中:

<input asp-for="DateUploaded" class="form-control" value="@DateTime.Now.ToString("yyyy-MM-dd HH:mm")" />

但是日期选择器总是显示空白,像这样,我想让它自动加载当前日期和时间,精确到分钟:

尽管消息来源显示有一个值。这让我相信它可能与 jquery 有关,但我不知道那可能是什么,我什至不确定要寻找什么。迄今为止的尝试尚未产生解决方案。

<input class="form-control" value="2018-09-13 13:36" type="datetime-local" data-val="true" data-val-required="The DateUploaded field is required." id=" name="DateUploaded" />

我还尝试在模型中添加以下内容,但没有结果:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}", ApplyFormatInEditMode = true)]

首先,当您绑定到 DateTime 类型的 属性(以及 DateTime 类型的 DataType)时,InputTagHelper 将呈现类型为 datetime-local 的输入。这将触发支持浏览器显示日期选择器控件,这就是您在此处看到的内容。但是,此内置控件仅适用于 ISO 格式的 date/time 值,而您的日期时间字符串则不是。如果无法将字符串解析为 ISO 日期时间,则会将其视为空值,因此不会显示任何值。

总而言之,您需要为其提供日期时间字符串,例如:yyyy-MM-dd\Thh:mm:ss,或简单地 o.

@DateTime.Now.ToString("o")

其次,当绑定到特定的 属性(使用 asp-for)时,您不应手动提供值。相反,如果您希望 属性 默认为 DateTime.Now,请将其设置为 属性:

的默认值
[DataType(DataType.DateTime)]
public DateTime DateUploaded { get; set; } = DateTime.Now;

在这种情况下,您实际上根本不需要格式化它,因为 Razor 会为您处理。

最后,使用 DateTime.Now 对于 Web 应用程序来说是一个非常糟糕的主意。该值将是服务器 上的当前时间 ,几乎可以肯定不会是用户的 "now",除非他们恰好与您的服务器处于同一时区居住。相反,使用 DateTime.UtcNow 或更好的 DateTimeOffset.UtcNow.