在服务器asp.net mvc 3上反序列化javascript日期

Leo*_*eon 4 javascript asp.net jquery asp.net-mvc-3

我一直在努力解决这个问题.我正在尝试向客户端发送一个对象.一旦客户端更新了对象,我想将其发布回服务器并将其保存在我的数据库中.第一部分工作正常.但是,当我发回它时,所有日期都搞砸了并开始了0001年.我认为这是因为它无法反序列化日期.我可以发布一个带有日期属性的json对象,并使用asp.net mvc 3将其反序列化为服务器上的类型吗?

小组是

public class Group
{
    public Group();

    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public string Description { get; set; }
    public string Name{ get; set; }
    public string Status { get; set; }
    public string UpdatedBy { get; set; }
    public DateTime UpdatedOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

    public JsonResult updateGroup(Group group)
    {
        var result = Repository.updateGroup(group);
        return Json(result, JsonRequestBehavior.AllowGet);
    }
Run Code Online (Sandbox Code Playgroud)

我得到了客户

    $.ajax({
        url: '../updateGroup',
        type: 'POST',
        data: JSON.stringify(group),
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function(){ success(); }
    });
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

ASP.NET MVC 3使用JavaScriptSerializer反向反序列化值.引用本课程的文档:

日期对象,以JSON表示为"\ /日期(刻度数)\ /".刻度数是一个正或负的长值,表示自UTC时间1970年1月1日午夜以来经过的刻度数(毫秒).

支持的最大日期值为MaxValue(12/31/9999 11:59:59 PM),支持的最小日期值为MinValue(1/1/0001 12:00:00 AM).

这基本上意味着您的请求对象必须看起来像这样:

{ CreatedOn: '\/Date(1299098853123)\/', CreatedBy: 'foo', ... }
Run Code Online (Sandbox Code Playgroud)

所以这是你如何进行的:

// taking the local time but this could be any javascript Date object
var now = new Date(); 
var group = {
    CreatedBy: 'foo',
    CreatedOn: '\/Date(' + now.getTime() + ')\/',
    Description: 'some description',
    Name: 'some name',
    etc...
};
Run Code Online (Sandbox Code Playgroud)

当然,因为我们现在正在使用UTC,如果您需要使用本地时间(首选UTC),请不要忘记补偿服务器上的本地时间:

public ActionResult UpdateGroup(Group group)
{
    DateTime serverCreatedOn = group.CreatedOn.ToLocalTime();
    ...
}
Run Code Online (Sandbox Code Playgroud)

也不要像这样硬编码网址:

url: '../updateGroup'
Run Code Online (Sandbox Code Playgroud)

在处理网址时始终使用网址帮助程序,或者在发货时可能会出现意外情况:

url: '@Url.Action("updateGroup")'
Run Code Online (Sandbox Code Playgroud)

更新:

尝试编码这样的日期:

// taking the local time but this could be any javascript Date object
var now = new Date(); 
var group = {
    CreatedBy: 'foo',
    CreatedOn: now.toUTCString(),
    Description: 'some description',
    Name: 'some name',
    etc...
};
Run Code Online (Sandbox Code Playgroud)