2012-02-23 43 views
10

Khi tôi đăng một đối tượng json với thuộc tính ngày tháng vào một ApiController nó sẽ không deserialize vào một ngày.Đăng ngày giờ vào một ApiController trong ASP MVC 4 (Beta)

máy chủ trang web mã:

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; } 
} 

Sau đó, tôi làm một yêu cầu POST với cáy

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

User-Agent: Fiddler

Host: localhost : 62990

Content-Type: text/json

Content-Length: 54

{ "Ngày": "/ ngày (1239018869048) /", "Tên": "Dude" }

Nhưng đối tượng sắp tới trong chỉ có các thiết lập Name tài sản, Date tài sản là {01.01.0001 00:00:00}

tôi có thiếu bất kỳ tiêu đề hoặc thiết lập dự án?


Sửa: Các yêu cầu được thực sự đến từ một HttpClient. Có thể định dạng ngày trước khi gửi yêu cầu với HttpClient không?

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); 

Sửa: Đây là một lỗi được biết đến với 4 Beta ASP MVC và phiên bản cuối cùng của ASP MVC 4 sẽ sử dụng Json.net như một serializer json cho đến khi sau đó bạn có thể sử dụng serializer XML mặc định hoặc tắt bộ nối tiếp Json mặc định cho Json.net. Bạn có thể tìm thêm thông tin trên hanselman blog

+0

http://stackoverflow.com/questions/206384/how-to-format-a-json-date – tugberk

Trả lời

4

Đây là một lỗi được biết đến với ASP MVC 4 Beta và phiên bản cuối cùng của ASP MVC 4 sẽ sử dụng Json.net như một serializer json cho đến khi sau đó bạn có thể sử dụng serializer XML mặc định hoặc chuyển đổi ra các mặc định Json serializer cho Json.net. Thông tin thêm có thể được tìm thấy trên hanselman blog

Dưới đây là một ví dụ nhỏ về cách sử dụng XML mặc định Serializer để gửi DateTime với 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); 

Nhưng nếu bạn muốn sử dụng json thì đây là một bài đăng blog tốt trên using JSON.NET with ASP.NET Web API

16

Cố gắng đăng ngày/giờ của bạn là "yyyy-MM-dd HH: mm: ss". ASP MVC sẽ xử lý nó đúng cách.

+2

Nó không phụ thuộc vào văn hóa máy chủ hiện tại? –

8

Dường như Web API không chấp nhận các ngày trong định dạng ASP.NET AJAX cũ cho dữ liệu POST được mã hóa URL. Dường như có hai định dạng mà nó chấp nhận URL mã hóa trong ngày hiện:

ShortDateString: "2012/02/23"

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

Các sau đó là định dạng ISO DateTime và có nhiều đoạn mã khác nhau mà bạn có thể tìm thấy để trợ giúp chuyển đổi đối tượng Ngày tháng sang định dạng đó. Một số đề cập ở đây: How do I output an ISO 8601 formatted string in JavaScript?

Web API không vẫn chấp nhận/Date()/định dạng nếu bạn gửi dữ liệu như JSON và thiết lập Content-Type chính xác mặc dù:

$.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 sử dụng DataContractJsonSerializer có lỗi xung quanh việc tuần tự hóa DateTime. Bạn nên sử dụng JSON.Net thay vào đó, và thực hiện một MediaTypeFormatter sử dụng JSON.Net thay vì DataContractJsonSerializer. Hãy xem câu trả lời của tôi cho một câu hỏi tương tự here.

Các vấn đề liên quan