ASP.NET MVC控制器在转换时失去了一天

时间:2017-11-02 18:24:51

标签: json asp.net-mvc date datacontractjsonserializer

我将一些数据从本地应用程序发送到另一个应用程序(ASP.NET MVC)。数据是DTO数组。我正在我的本地机器上测试它。

本地应用程序是Web窗体并使用服务发送数据。我不使用JsonResult。

序列化的DTO被正确发送,但是在MVC端错误地反序列化日期,比发送的日期落后一天。

DTO课程如下所示:


    [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":"/Date(1461790800000+0300)/","FinalDate":"/Date(1557435600000+0300)/" }

接收数据的方法如下所示:

public ActionResult GetProjectData(ProjectInfoDto[] info) {...}

原始日期是(来自数据库):

BeginDate - &gt; 2016-04-28 00:00:00.000

FinalDate - &gt; 2019-05-10 00:00:00.000

查看收到的数组时MVC端的日期:

BeginDate - &gt; 2016-04-27 00:00:00.000

FinalDate - &gt; 2019-05-09 00:00:00.000

我不知道为什么日期是收到后的一天。

1 个答案:

答案 0 :(得分:0)

我在这个问题Is there a way to override how DataContractJsonSerializer serializes Dates?中找到了一个建议。

问题的答案建议创建一个实例方法并使用

[OnSerializing]
属性进行修饰。这将允许自定义序列化某些属性。

以下完整代码:

[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”)。