2012-02-23 70 views
10

當我發佈帶有日期屬性的json對象到ApiController時,它不會反序列化爲日期。將日期時間發佈到ASP MVC 4中的ApiController(Beta)

服務器站點代碼:

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

的User-Agent:提琴手

主機:本地主機:62990

內容類型:text/JSON

的Content-Length: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); 

編輯:這是一個已知的bug與ASP MVC 4 Beta版和ASP MVC 4的最終版本將使用Json.net作爲JSON序列化到那時,你可以使用默認的XML序列化或將Json.net的默認Json串行器切換出來。更多信息可以在hanselman blog

+0

http://stackoverflow.com/questions/206384/how-to-format-a-json-date – tugberk 2012-02-23 19:25:06

回答

4

這是ASP MVC 4 Beta的一個已知錯誤,ASP MVC 4的最終版本將使用Json.net作爲json串行器,直到您可以使用默認的XML串行器或者爲Json.net轉換默認的Json串行器。更多信息可在hanselman blog

發現這裏是使用默認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那麼這裏是一個很好的博客文章對using JSON.NET with ASP.NET Web API

16

嘗試發佈您的日期/時間爲「yyyy-MM-dd HH:mm:ss」。 ASP MVC將正確處理它。

+2

是不是取決於當前的服務器文化? – 2015-05-19 12:34:17

8

似乎Web API不接受舊的ASP.NET AJAX格式的URL編碼POST數據的日期。似乎有它接受URL編碼日期在目前兩種格式:

ShortDateString: 「2012年2月23日」

ISO: 「2012-02-23T00:00:00」

的以後是ISO DateTime格式,並且可以找到各種代碼片段來幫助將JavaScript Date對象轉換爲該格式。這裏提到的幾種:How do I output an ISO 8601 formatted string in JavaScript?

的Web API 仍然接受/日期()/格式,如果您發送的數據作爲JSON和設置的內容類型,雖然正確:

$.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" }' 
}); 
1

ASP。Net Web API使用DataContractJsonSerializer,該漏洞包含DateTime序列化周圍的錯誤。您應該使用JSON.Net,並實現使用JSON.Net而不是DataContractJsonSerializer的MediaTypeFormatter。查看我的回答,獲取類似問題here