【问题标题】:JSON Date parameter passed to MVC Action is always null传递给 MVC 操作的 JSON 日期参数始终为空
【发布时间】:2011-04-04 17:43:13
【问题描述】:

我有一系列通过 jQuery Ajax 传递给 MVC JsonResult 操作的参数。在大多数情况下,这些成功到达,但有一个 Date 值根本没有到达。

我需要使用哪些注意事项/格式 - 或者我需要采取哪些方法 - 才能让这个日期成功到达?

...other code ...
myStory.Deadline = new Date($('#story-deadline').val());

$.ajax({
    url: '/Project/' + action[2] + '/AddStory',
    data: { Summary: myStory.Summary, Size: myStory.Size, Priority: myStory.Priority,
            Owner: myStory.Owner, Deadline: myStory.Deadline },
    dataType: 'json',
    traditional: true,
    type: 'POST',
...the rest of the code...

JsonResult 动作:

[HttpPost]
public JsonResult AddStory(int projectid, Story story)
{
...some code that doesn't have a DateTime object to work with...

【问题讨论】:

    标签: jquery json datetime asp.net-mvc-2 types


    【解决方案1】:

    Microsoft 使用JavaScriptSerializer 序列化/去实化 ASP.NET MVC 数据。如果对Date 数据类型使用/Date(utcDate)/ 格式。尝试使用

    '"\\/Date(' + myStory.Deadline.getTime() + ')\\/"'
    

    var d = myStory.Deadline;
    var dateForMS = '"\\/Date(' +
            Date.UTC (d.getUTCFullYear(), d.getUTCMonth(),
                      d.getUTCDate(), d.getUTCHours(),
                      d.getUTCMinutes(), d.getUTCSeconds(),
                      d.getUTCMilliseconds()) + ')\\/"'
    

    您也可以只使用MicrosoftAjax.js 中的Sys.Serialization.JavaScriptSerializer 来序列化Deadline 或任何其他Date 类型。

    更新:可能你应该使用'\/Date('')\/' 而不是'"\\/Date('')\\/"'。一切都取决于您将插入字符串的位置。

    更新 2:现在我有了! ASP.NET MVC 主要用于每个 Ajax 的发布表单字段。在服务器端,每个类型都将使用Parse 方法将发布的参数转换为类型。因此可以使用DateTime.Parse 支持的任何字符串格式。例如,您可以使用 ISO 8601 格式,例如“2010-08-29T13:15:00.0000000Z”。要在现代浏览器(firefox、chrome)中执行此操作,可以使用toISOString() 函数。为了更加独立,可以像http://williamsportwebdeveloper.com/cgi/wp/?p=503中描述的那样实现数据转换:

    var d = new Date($('#story-deadline').val())
    //var d = new Date(); // get the date. Here we use just Now.
    var dAsISOString;
    if ($.isFunction(d.toISOString)) {
        //alert("internal toISOString are used!");
        dAsISOString = d.toISOString();
    }
    else {
        dAsISOString = d.getUTCFullYear() + '-' + padzero(d.getUTCMonth() + 1) + '-' +
                       padzero(d.getUTCDate()) + 'T' + padzero(d.getUTCHours()) + ':' +
                       padzero(d.getUTCMinutes()) + ':' + padzero(d.getUTCSeconds())+'.'+
                       pad2zeros(d.getUTCMilliseconds()) + 'Z';
    }
    var myStory = { Summary: 'Test description', Size: 8, Dedline: dAsISOString };
    $.ajax({
        url: '/Project/1/AddStory',
        data: { Summary: myStory.Summary, Size: myStory.Size, Dedline: myStory.Dedline },
        dataType: 'json',
        // ...
    });
    

    【讨论】:

    • 我已经尝试了您的原始格式建议和更新的建议,但两者仍然为空。但是,它们已正确发布:截止日期“/Date(1283169600000)/”
    • 看来应该用MVC的源代码来测试问题(见weblogs.asp.net/jacqueseloff/archive/2010/04/20/…aspnet.codeplex.com/releases/view/41742)。如果您有任何结果,请告诉我。
    • 它仅适用于我手动将数据序列化为 json 的情况。 数据:JSON.stringify(params),
    • @vsapiha:这个问题完全取决于您使用的配置参数和您使用的 ASP.NET MVC 版本。我在我之前测试过的答案中发布的代码。如果在您的配置中 data: JSON.stringify(params) 有效:很好!然后使用它。
    • @Oleg 最好在此处添加一个将 json 转换为对象的过滤器,因为我不能使用比 javascript 序列化程序成熟得多的其他 json 提供程序,例如 newtonsoft,您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多