开发者

Passing a date with JSON to .NET

Here is my jQuery code:

function onSaveClicked()
{
    var message = 
    {
        MessageID: $("#MessageID").val() || 0,
        MessageDate: "\/Date(<%= DateTime.Now.Ticks %>)\/",
    };


    $.ajax({
       url: "<%= Url.Action("SaveMessage") %>",
       type: "POST",
       dataType: "json",
       data: $.toJSON(message),
       contentType: "application/json; charset=utf-8",
       success: function(result) {
            if (result && result.success)
            {
                //
            }
       }
   }); 
}

At first, I was just setting MessageDate to a string that was in a date format, but after some errors there, I did some research and it looks like I need to pass in the Ticks. But I get the following error:

There was an error deserializing the object of type Models.MessageModel. The value '634185025866884281'开发者_运维问答 cannot be parsed as the type 'DateTime'

I've also tried:

MessageDate: "\\/Date(<%= DateTime.Now.Ticks %>)\\/",

but I get this error message:

There was an error deserializing the object of type Models.MessageModel. DateTime content '/Date(634185027273624742)/' does not start with '/Date(' and end with ')/' as required for JSON.

What do I need to do to get this working?

EDIT: I'm using this to deserialize the JSON request:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
    {
        var serializer = new DataContractJsonSerializer(RootType);
        //RootType here is (Name = "MessageModel", FullName="Models.MessageModel")

        filterContext.ActionParameters["message"] = serializer.ReadObject(filterContext.HttpContext.Request.InputStream);


    }
}


You may try the following function:

public static string FormatDate(DateTime dt)
{
    var serializer = new DataContractJsonSerializer(typeof(DateTime));
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, dt);
        return Encoding.Default.GetString(stream.ToArray());
    }
} 

And in your view:

var message = 
{
    MessageID: $("#MessageID").val() || 0,
    MessageDate: "/Date(<%= SomeClass.FormatDate(DateTime.Now) %>)/"
};


I had the same problem. What I did was use the following function to convert it to a number

private double GetUnixEpoch(DateTime dateTime)
    {
        var unixTime = dateTime.ToUniversalTime() -
            new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

        return unixTime.TotalMilliseconds;
    }

Then you can use that number in the constructor of the Javascript date object to create the date object.


This post gives this solution (modified) which you'd put on the client with JSON.stringify():

jsonData = JSON.stringify([new Date()], 
    function (k, v) { return this[k] instanceof Date ? '/Date(' + v + ')/' : v; });

Which works in the latest IE, Chrome, and Firefox for me.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜