C# 当ASP.Net收到带有DateTime属性的发布模型时,什么决定了DateTime.Kind?

C# 当ASP.Net收到带有DateTime属性的发布模型时,什么决定了DateTime.Kind?,c#,asp.net,asp.net-mvc,datetime,momentjs,C#,Asp.net,Asp.net Mvc,Datetime,Momentjs,我们有许多Vue页面,带有Typescript模型,它们提交给相同的控制器操作。控制器采用单个复杂参数,类具有DateTime属性 Vue页面经过一段时间的修改,现在看起来彼此非常不同。但是,在所有情况下,DateTime属性都是从inputDateOfBirth字段获取的,并使用矩进行映射。代码看起来有点像这样: var dob = Helpers.ToMoment(this.inputDateOfBirth); if (dob.isValid()) { this.dateOfBir

我们有许多Vue页面,带有Typescript模型,它们提交给相同的控制器操作。控制器采用单个复杂参数,类具有DateTime属性

Vue页面经过一段时间的修改,现在看起来彼此非常不同。但是,在所有情况下,DateTime属性都是从inputDateOfBirth字段获取的,并使用矩进行映射。代码看起来有点像这样:

var dob = Helpers.ToMoment(this.inputDateOfBirth);

if (dob.isValid()) {
    this.dateOfBirth = dob.format("YYYY-MM-DD HH:mm:ss");
}
在Typescript模型中,
dateOfBirth
inputDateOfBirth
都列为类型
string

在大多数情况下,最终由控制器操作接收的复杂参数的DateTime属性为
DateTime.Kind
of
Utc
。但是,其中一个具有
DateTime.Kind
Unspecified
。这将导致问题进一步恶化


是什么决定了ASP.NET MVC中C#控制器操作解释的数据的DateTime.Kind值,我可以做些什么来确保它作为Utc一致地接收?

日期格式可能会导致这种差异。
DateTime的默认模型活页夹需要
时区指示符
,这意味着如果您的日期字符串如下所示
2009-06-15T13:45:30.0000000 Z
,则
DateTime.Kind
UTC
显示为“Z”。
或者,如果像这样
2009-06-15T13:45:30.0000000-07:00
,在显示时区偏移量“-07:00”的情况下,
DateTime.Kind
将是
Local


如果未显示任何这些属性,
DateTime.Kind
将在提交时未指定

在这两种情况下,日期字符串为“1974-07-22 00:00:00”-但其中一个作为UTC接收,另一个作为未指定。还有其他因素吗?@BobTway您是如何检查发送的数据是否确实存在的“1974-07-22 00:00:00格式?检查JS对象或请求负载?@BobTway这可能是检查实际发送到服务器的内容的不可靠方法。您能在网络面板中检查请求并确认格式吗?正如我所看到的,ASP.NET使用简单的内部结构,利用当前的线程文化信息。检查备注部分。@BobTway这太奇怪了!在任何情况下,为了确保
Kind
始终是UTC,您需要控制客户端发送给API的内容,并使所有日期和时间类型的数据符合
ISO 8601
时间格式。这意味着Momento发送的所有东西都应该有
Z
后缀或时区偏移。无法控制服务器端的这种行为,因为您不需要为您拥有的每个模型编写自定义模型绑定器。@BobTway遗憾的是,我们没有找到原因。我在ModelBinder的源代码中查找了DateTime和DateTime.Parse本身。它们是通过输入字符串的格式和线程的CultureInfo配置的,我假设一个请求的CultureInfo应该是相同的。唯一影响反序列化的地方是自定义绑定,您可以在代码中搜索从
IModelBinder
IModelBinderProvider
继承的任何内容-这两个内容用于自定义绑定配置。但更可能的是,客户端做了一些特定的事情,但很难从我的角度进行分析,唉!