当我将带有日期属性的json对象发布到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; }
}
然后我用fiddler
做一个POST请求POST http://localhost:62990/MegaTest HTTP / 1.1
User-Agent:Fiddler
主持人:localhost:62990
Content-Type:text / 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.net的默认Json序列化程序。有关详细信息,请参阅hanselman blog
答案 0 :(得分:17)
尝试将您的日期/时间发布为“yyyy-MM-dd HH:mm:ss”。 ASP MVC将正确处理它。
答案 1 :(得分:8)
对于URL编码的POST数据,Web API似乎不接受旧的ASP.NET AJAX格式的日期。目前似乎有两种格式接受URL编码日期:
ShortDateString:“2/23/2012”
ISO:“2012-02-23T00:00:00”
后者是ISO DateTime格式,您可以找到各种代码片段来帮助将JavaScript Date对象转换为该格式。这里提到的几个:How do I output an ISO 8601 formatted string in JavaScript?
如果您将该数据作为JSON发送并正确设置Content-Type,则Web API 仍然接受/ Date()/格式:
$.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" }'
});
答案 2 :(得分:4)
这是ASP MVC 4 Beta的已知错误,ASP MVC 4的最终版本将使用Json.net作为json序列化程序,直到那时您可以使用默认的XML序列化程序或切换出默认的Json序列化程序Json.net。有关详细信息,请参阅hanselman blog
以下是使用默认XML Serializer通过HttpClient发送DateTime
的一个小示例:
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,那么这是一篇关于using JSON.NET with ASP.NET Web API
的好文章答案 3 :(得分:1)
ASP.Net Web API使用DataContractJsonSerializer
,其中包含DateTime
序列化的错误。您应该使用JSON.Net,并实现使用JSON.Net而不是DataContractJsonSerializer的MediaTypeFormatter
。查看我对类似问题的回答here。