【问题标题】:Passing a date with JSON to .NET将带有 JSON 的日期传递给 .NET
【发布时间】:2026-01-16 21:40:01
【问题描述】:

这是我的 jQuery 代码:

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)
            {
                //
            }
       }
   }); 
}

起初,我只是将 MessageDate 设置为日期格式的字符串,但在出现一些错误之后,我做了一些研究,看起来我需要传入 Ticks。但我收到以下错误:

反序列化 Models.MessageModel 类型的对象时出错。值 '634185025866884281' 无法解析为类型 'DateTime'

我也试过了:

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

但我收到此错误消息:

反序列化 Models.MessageModel 类型的对象时出错。 DateTime 内容 '/Date(634185027273624742)/' 不是 JSON 所要求的以 '/Date(' 开头并以 ')/' 结尾。

我需要做什么才能让它工作?

编辑: 我正在使用它来反序列化 JSON 请求:

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);


    }
}

【问题讨论】:

  • 您使用什么SaveMessage 操作来反序列化 JSON 请求?
  • 我编辑了我的原件,现在显示在上面。

标签: .net jquery asp.net-mvc json


【解决方案1】:

您可以尝试以下功能:

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());
    }
} 

在你看来:

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

【讨论】:

  • 这给了我以下错误:反序列化 Models.MessageModel 类型的对象时出错。值 '/Date(1282924488721' 无法解析为类型 'Int64'
  • 您能发布在您的 ActionFilter 中传递的 JSON 字符串吗?在您的示例中,filterContext.HttpContext.Request.InputStream. 的内容
  • 我将流读入字节数组,然后将字节数组转换为字符串。这是结果:“1233477101115115971031017368345848443484105116108101345834116101115116503444346810111599114105112116105111110345834116101115116105110103344434689711610183116971141163458344768971161014047689711610140495056505750565150515654504548524848414741473444346897116101691101003458344768971161014047689711610140495056505750565150515654514548524848414741473444348610511510598108101345810297108115101125” 跨度>
【解决方案2】:

我遇到了同样的问题。我所做的是使用以下函数将其转换为数字

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

        return unixTime.TotalMilliseconds;
    }

然后您可以在 Javascript 日期对象的构造函数中使用该数字来创建日期对象。

【讨论】:

  • 你能给我举个例子来说明我如何在我的 Javascript 中使用它吗?
【解决方案3】:

This post 提供了这个解决方案(修改后的),您可以使用 JSON.stringify() 将其放在客户端上:

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

这适用于我最新的 IE、Chrome 和 Firefox。

【讨论】: