【问题标题】:Date is invalid on POST, but valid when I GET the page日期在 POST 上无效,但在我获取页面时有效
【发布时间】:2018-02-26 15:43:40
【问题描述】:

我有一个基于模型的简单 ASP.NET MVC 视图。该模型具有以下属性:

    public DateTime PaymentStartDate { get; set; }

当我在 GET 方法中进入我的视图时,PaymentStartDate 的值是 3 月 31 日 (31/3/2018 23:59:59)。

在我看来,我做了以下事情:

    @Html.HiddenFor(c => c.PaymentStartDate)

呈现如下:

<input data-val="true" data-val-date="The field PaymentStartDate must be a date." data-val-required="The PaymentStartDate field is required." id="PaymentStartDate" name="PaymentStartDate" type="hidden" value="03/31/2018 23:59:59" />

但是当我 POST 到我的端点时,我的模型状态无效,因为:

The value '03/31/2018 23:59:59' is not valid for PaymentStartDate.

问题:

如果我选择一个日期,例如3/12/2018,它会起作用。所以我的假设是因为我有一台丹麦机器(使用 dd/MM/yyyy 格式),它会带来一些问题。

任何想法或提示我可以在这里做什么?

【问题讨论】:

  • 始终对 Date 和 DateTime 值使用 ISO8601 表示法,特别是当您将值存储为字符串(如在 HTML 中)以及在 2 个端点(如浏览器和服务器)之间发送值时。
  • 是的,很可能就是这样。使用明确的日期格式,例如 ISO8601。 Ps 03/12/2018 可能“有效”,但服务器会认为您的意思是 3 月 12 日而不是 12 月 3 日,因此它可能无法按您的预期工作
  • 如果你不需要显示它,我会说总是使用 Unix 时间戳。 0 歧义

标签: c# asp.net-mvc asp.net-mvc-5 globalization


【解决方案1】:

始终对DateDateTime 值使用ISO8601 表示法。特别是当您将值存储为字符串时(例如在隐藏输入字段中的 HTML 中)以及在 2 个端点之间发送值时(例如在浏览器和服务器之间)。

这样,无论客户端或服务器文化如何,都不会产生歧义。

例子:

@Html.HiddenFor(c => c.PaymentStartDate.ToString("o"))

另见The Round-trip ("O", "o") Format Specifier

【讨论】:

  • 有道理!所以在 ASP.NET MVC 中,我猜这是添加“.ToUniversalTime();” ? :)
  • @LarsHoldgaard - 不,这是与 when 发生时间有关的 UTC。还建议将日期和日期时间转换为 UTC,这样无论时区如何,都不会对实际发生的事情产生歧义。
  • @LarsHoldgaard - ISO8601 严格处理如何将日期/日期时间格式化为字符串,以便它可以被解析/读取,并且无论是否客户端机器设置为日本、英国、美国等文化
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多