传递到MVC行动JSON日期参数总是空 [英] JSON Date parameter passed to MVC Action is always null

查看:121
本文介绍了传递到MVC行动JSON日期参数总是空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一系列的通过jQuery的阿贾克斯传递到MVC JsonResult动作参数。在大多数情况下,这些成功抵达,但就是没有到达所有的日期值。

什么注意事项/格式做我需要使用 - 或做什么办法我需要 - 为了得到这个日期到达成功

  ...等code ...
myStory.Deadline =新的日期($('#故事的最后期限')VAL());$阿贾克斯({
    网址:'/项目/+操作[2] +'/ AddStory',
    数据:{摘要:myStory.Summary,尺寸:myStory.Size,优先级:myStory.Priority,
            业主:myStory.Owner,投标截止时间:myStory.Deadline},
    数据类型:JSON,
    传统:真实,
    输入:POST,
...在code休息...

该JsonResult动作:

  [HttpPost]
公共JsonResult AddStory(INT专案编号,剧情故事)
{
......有些code,它没有一个DateTime对象一起工作...


解决方案

微软使用<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx\"相对=nofollow>的JavaScriptSerializer 序列化/ desirealize的ASP.NET MVC的数据。如果使用 /日期(utcDate)为日期/ 格式数据类型。尝试使用

 '\\\\ /日期('+ myStory.Deadline.getTime()+')\\\\ /'

 变种D = myStory.Deadline;
VAR dateForMS ='\\\\ /日期('+
        Date.UTC(d.getUTCFullYear(),d.getUTCMonth(),
                  d.getUTCDate(),d.getUTCHours(),
                  d.getUTCMinutes(),d.getUTCSeconds(),
                  d.getUTCMilliseconds())+')\\\\ /'

您也可以只用 Sys.Serialization.JavaScriptSerializer MicrosoftAjax.js 连载截止日期或任何其他日期键入

更新时间::也许你应该使用'\\ /日期(')\\ /来代替'\\\\ /日期()\\\\ /'。一切都取决于你插入的文本。

更新2 :现在我有啦! ASP.NET MVC主要用于每阿贾克斯发布表单域。在服务器端将只用解析方法,为每个类型张贴的参数转换为类型。因此,人们可以使用它们由 DateTime.Parse 。例如,您可以使用ISO 8601格式,如2010-08-29T13:15:00.0000000Z。要在现代浏览器(火狐,Chrome),可以使用 toISOString()功能做到这一点。为了更影响无关可以实现数据转换像 http://williamsportwebdeveloper.com/cgi/ ?WP / p = 503

 变种D =新的日期($('#故事的最后期限)。VAL())
//变种D =新的日期(); //获取日期。在这里,我们只使用现在。
VAR dAsISOString;
如果($ .isFunction(d.toISOString)){
    //警报(内部toISOString使用!);
    dAsISOString = d.toISOString();
}
其他{
    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 = {摘要:测试说明,尺寸:8,Dedline:dAsISOString};
$阿贾克斯({
    网址:'/项目/ 1 / AddStory',
    数据:{摘要:myStory.Summary,尺寸:myStory.Size,Dedline:myStory.Dedline},
    数据类型:JSON,
    // ...
});

I have a range of parameters that are passed via jQuery Ajax to an MVC JsonResult action. For the most part, these arrive successfully, but there is a Date value that is not arriving at all.

What considerations / formats do I need to use - or what approaches do I need to take - in order to get this date to arrive successfully?

...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...

The JsonResult action:

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

解决方案

Microsoft use JavaScriptSerializer to serialize/desirealize the ASP.NET MVC data. If use /Date(utcDate)/ format for the Date data type. Try to use

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

or

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

You can also just use Sys.Serialization.JavaScriptSerializer from MicrosoftAjax.js to serialize Deadline or any other Date type.

UPDATED: Probably you should use '\/Date(' and ')\/' instead of '"\\/Date(' and ')\\/"'. All depends on where you will insert the string.

UPDATED 2: Now I have it! ASP.NET MVC is used mostly for the posting Form fields per Ajax. On the server side will be just used Parse method for every type to convert the posted parameter to the type. So one can use any string format which are supported by DateTime.Parse. For example you can use ISO 8601 format like '2010-08-29T13:15:00.0000000Z'. To do this in modern browsers (firefox, chrome) one can use toISOString() function. To be more independend one can implement data conversion like described in 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',
    // ...
});

这篇关于传递到MVC行动JSON日期参数总是空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆