Параметр даты JSON, переданный в MVC Action, всегда имеет значение null - PullRequest
4 голосов
/ 27 августа 2010

У меня есть ряд параметров, которые передаются через 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...

1 Ответ

5 голосов
/ 27 августа 2010

Microsoft использует JavaScriptSerializer для сериализации / извлечения данных из ASP.NET MVC.Если используется тип /Date(utcDate)/ для типа данных Date.Попробуйте использовать

'"\\/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()) + ')\\/"'

Вы также можете просто использовать Sys.Serialization.JavaScriptSerializer из MicrosoftAjax.js для сериализации 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',
    // ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...