ASP.NET MVC 控制器在转换上损失了一天
ASP.NET MVC controller losing a day on conversion
我正在将一些数据从本地应用程序发送到另一个应用程序 (ASP.NET MVC)。数据是一个 DTO 数组。我正在我的本地机器上测试这个。
本地应用程序是一个 Web 窗体,正在使用服务发送数据。我不使用 JsonResult。
序列化的 DTO 已正确发送,但日期在 MVC 端反序列化不正确,比发送日期晚一天。
DTO class 看起来像这样:
[DataContract]
public class ProjectInfoDto
{
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
[DataMember]
public DateTime BeginDate { get; set; }
[DataMember]
public DateTime FinalDate { get; set; }
}
我正在使用以下方法序列化数据:
public static string JsonSerialize<T>(T obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, obj);
string retVal = Encoding.Default.GetString(ms.ToArray());
ms.Dispose();
return retVal;
}
发送到 MVC 应用程序的 JSON 看起来像这样(具有正确的日期):
{"ProjectId":"222","ProjcetCode":"OP9089","BeginDate":"/日期(1461790800000+0300)/","FinalDate":"/日期( 1557435600000+0300)/"}
接收数据的方法如下所示:
public ActionResult GetProjectData(ProjectInfoDto[] info) {...}
原始日期是(来自数据库):
开始日期 -> 2016-04-28 00:00:00.000
最终日期 -> 2019-05-10 00:00:00.000
查看接收到的数组时 MVC 端的日期:
开始日期 -> 2016-04-27 00:00:00.000
最终日期 -> 2019-05-09 00:00:00.000
我不知道为什么收到的日期晚了一天。
我在这个问题中找到了一个建议 Is there a way to override how DataContractJsonSerializer serializes Dates?。
问题中的答案建议创建一个实例方法并使用
[OnSerializing]
属性对其进行修饰。这将允许对某些属性进行自定义序列化。
完整代码如下:
</p>
<pre><code>[DataContract]
public class ProjectInfoDto
{
[DataMember(Name = "BeginDate")]
private string beginDate;
[DataMember(Name = "ExecutieDataFinal")]
private string finalDate;
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
public DateTime BeginDate { get; set; }
public DateTime FinalDate { get; set; }
[OnSerializing]
void OnSerializing(StreamingContext context)
{
beginDate = BeginDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
finalDate = FinalDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
}
}
想法是完整保留 DateTime 属性,并使用私有字符串字段进行序列化。在 OnSerializing 方法中,您将 DateTime 属性转换为所需的格式。根据对我的问题的评论中的建议,我使用了 ISO-8601 格式 ("yyyy-MM-dd")。
我正在将一些数据从本地应用程序发送到另一个应用程序 (ASP.NET MVC)。数据是一个 DTO 数组。我正在我的本地机器上测试这个。
本地应用程序是一个 Web 窗体,正在使用服务发送数据。我不使用 JsonResult。
序列化的 DTO 已正确发送,但日期在 MVC 端反序列化不正确,比发送日期晚一天。
DTO class 看起来像这样:
[DataContract]
public class ProjectInfoDto
{
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
[DataMember]
public DateTime BeginDate { get; set; }
[DataMember]
public DateTime FinalDate { get; set; }
}
我正在使用以下方法序列化数据:
public static string JsonSerialize<T>(T obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, obj);
string retVal = Encoding.Default.GetString(ms.ToArray());
ms.Dispose();
return retVal;
}
发送到 MVC 应用程序的 JSON 看起来像这样(具有正确的日期):
{"ProjectId":"222","ProjcetCode":"OP9089","BeginDate":"/日期(1461790800000+0300)/","FinalDate":"/日期( 1557435600000+0300)/"}
接收数据的方法如下所示:
public ActionResult GetProjectData(ProjectInfoDto[] info) {...}
原始日期是(来自数据库):
开始日期 -> 2016-04-28 00:00:00.000
最终日期 -> 2019-05-10 00:00:00.000
查看接收到的数组时 MVC 端的日期:
开始日期 -> 2016-04-27 00:00:00.000
最终日期 -> 2019-05-09 00:00:00.000
我不知道为什么收到的日期晚了一天。
我在这个问题中找到了一个建议 Is there a way to override how DataContractJsonSerializer serializes Dates?。
问题中的答案建议创建一个实例方法并使用
[OnSerializing]
属性对其进行修饰。这将允许对某些属性进行自定义序列化。
完整代码如下:
</p>
<pre><code>[DataContract]
public class ProjectInfoDto
{
[DataMember(Name = "BeginDate")]
private string beginDate;
[DataMember(Name = "ExecutieDataFinal")]
private string finalDate;
[DataMember]
public long ProjectId { get; set; }
[DataMember]
public string ProjcetCode { get; set; }
public DateTime BeginDate { get; set; }
public DateTime FinalDate { get; set; }
[OnSerializing]
void OnSerializing(StreamingContext context)
{
beginDate = BeginDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
finalDate = FinalDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
}
}
想法是完整保留 DateTime 属性,并使用私有字符串字段进行序列化。在 OnSerializing 方法中,您将 DateTime 属性转换为所需的格式。根据对我的问题的评论中的建议,我使用了 ISO-8601 格式 ("yyyy-MM-dd")。