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")。