Отправка DateTime в ApiController в ASP MVC 4 (бета) - PullRequest
12 голосов
/ 23 февраля 2012

Когда я публикую json-объект со свойством date в ApiController, он не десериализуется в дату.

Код сайта сервера:

public class MegaTestController : ApiController
{
    // POST /megatest
    public void Post(ttt value)
    {
        string sdf = "!sad";
    }
}

public class ttt
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
}

Затем я выполняю запрос POSTс фиддлером

POST http://localhost:62990/MegaTest HTTP / 1.1

Пользователь-агент: Fiddler

Хост: localhost: 62990

Содержимое-Тип: текст / json

Длина содержимого: 54

{"Дата": "/ Дата (1239018869048) /", "Имя": "Чувак"}

Но для входящего объекта установлено только свойство Name, свойство Date равно {01.01.0001 00:00:00}

Я пропустил какие-либо заголовки или настройки проекта?


Редактировать : На самом деле запросы поступают от HttpClient.Можно ли отформатировать дату перед отправкой запроса с помощью HttpClient?

public Task<T> Create<T>(T item)
{
    var service = new HttpClient();
    service.BaseAddress = new Uri("http://localhost:62990");

    var method = typeof(T).Name + "s"; // in this case it will be ttts

    var req = new HttpRequestMessage<T>(item);
    req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

    return service.PostAsync(method, req.Content).ContinueWith((reslutTask) =>
    {
        return reslutTask.Result.Content.ReadAsAsync<T>();
    }).Unwrap();
}

var data = new ttt { Name = "Dude", Date = DateTime.Now };
Create(data);

Редактировать : это известная ошибка в ASP MVC 4 Beta иВ окончательной версии ASP MVC 4 Json.net будет использоваться в качестве сериализатора json, пока вы не сможете использовать сериализатор XML по умолчанию или отключить сериализатор Json по умолчанию для Json.net .Более подробную информацию можно найти в блоге hanselman

Ответы [ 4 ]

17 голосов
/ 23 февраля 2012

Попробуйте опубликовать дату / время как "гггг-мм-дд чч: мм: сс".ASP MVC справится с этим правильно.

8 голосов
/ 23 февраля 2012

Похоже, что веб-API не принимает даты в старом формате ASP.NET AJAX для данных POST в формате URL.В настоящее время существует два формата, в которых он принимает даты в кодировке URL:

ShortDateString: "23.02.2012"

ISO: "2012-02-23T00: 00: 00"

Последним является формат ISO DateTime, и вы можете найти множество фрагментов кода, которые помогут преобразовать объект JavaScript Date в этот формат.Несколько из упомянутых здесь: Как вывести строку в формате ISO 8601 в JavaScript?

Веб-API все еще принимает формат / Date () /, если вы отправляетеданные в формате JSON и правильно установите Content-Type:

$.ajax({
  url: 'MegaTest',
  type: 'POST',
  // Setting this Content-Type and sending the data as a JSON string
  //  is what makes the old /Date()/ format work.
  contentType: 'application/json',
  data: '{ "Date":"/Date(1239018869048)/", "Name":"Dude" }'
});
4 голосов
/ 05 марта 2012

Это известная ошибка в ASP MVC 4 Beta, и в окончательной версии ASP MVC 4 будет использоваться Json.net в качестве сериализатора json, пока вы не сможете использовать сериализатор XML по умолчанию или отключить сериализатор Json по умолчанию для Json.net . Более подробную информацию можно найти в блоге hanselman

Вот небольшой пример использования сериализатора XML по умолчанию для отправки DateTime с HttpClient:

var service = new HttpClient();
service.BaseAddress = url;

var mediaType = new MediaTypeHeaderValue("application/xml");
XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter();
var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[] { formater });

service.PutAsync(method, req.Content);

Но если вы хотите использовать json, вот хороший пост в блоге по с использованием JSON.NET с ASP.NET Web API

1 голос
/ 28 февраля 2012

ASP.Net Web API использует DataContractJsonSerializer с ошибками, связанными с сериализацией DateTime.Вместо этого следует использовать JSON.Net и реализовать MediaTypeFormatter, который использует JSON.Net вместо DataContractJsonSerializer.Проверьте мой ответ на похожий вопрос здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...