2012-02-23 16 views
10

Kiedy umieszczam obiekt Json z właściwością date na ApiController, nie przekształci się to w datę.Opublikowanie DateTime do ApiController w ASP MVC 4 (Beta)

Server kod strony:

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

Potem zrobić żądania POST z Skrzypek

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

User-Agent: Skrzypek

Host: localhost : 62990

Content-Type: text/json

Content-Length: 54

{ "Date": "/ data (1239018869048) /", "Name": "Koleś" }

ale obiekt w najbliższych tylko ma zestaw Name nieruchomości, nieruchomość Date jest {01.01.0001 00:00:00}

jestem brakuje żadnych nagłówków lub ustawienia projektu?


Edit: Wnioski są rzeczywiście pochodzące z HttpClient. Czy możliwe jest sformatowanie daty przed wysłaniem żądania za pomocą 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); 

Edit: Jest to znany błąd z ASP MVC 4 beta i ostatecznej wersji ASP MVC 4 użyje Json.net jako serializatora json dopiero wtedy można użyć serializatora domyślne XML lub wyłącz domyślny serializator Json dla Json.net. Więcej informacji można znaleźć pod adresem hanselman blog

+0

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

Odpowiedz

4

To znany błąd z ASP MVC 4 beta i ostatecznej wersji ASP MVC 4 użyje Json.net jako serializatora json dopiero wtedy można użyć domyślnego serializatora XML lub przełączyć się domyślny JSON serializatora do Json.net. Więcej informacji można znaleźć na hanselman blog

Oto mały przykład przy użyciu domyślnego XML serializer wysłać DateTime z 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); 

Ale jeśli chcesz używać JSON to tutaj jest dobry blogu na using JSON.NET with ASP.NET Web API

16

Spróbuj wpisać datę/czas jako "yyyy-MM-dd GG: mm: ss". ASP MVC poradzi sobie z tym poprawnie.

+2

Czy to nie zależy od aktualnej kultury serwerów? –

8

Wygląda na to, że interfejs Web API nie akceptuje dat w starym formacie ASP.NET AJAX dla danych POST zakodowanych w URL. Wydaje się, że dwa formaty, że akceptuje URL zakodowane daty obecnie:

ShortDateString: "23.02.2012"

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

później jest format ISO DateTime i istnieje wiele fragmentów kodu, które można znaleźć, aby pomóc w konwersji obiektu Date JavaScript do tego formatu. Kilka wymienionych tutaj: How do I output an ISO 8601 formatted string in JavaScript?

Web API ma jeszcze zaakceptować/Date()/format jeśli wyślesz te dane jako JSON i ustawić Content-Type poprawnie mimo:

$.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 używa DataContractJsonSerializer, który zawiera błędy związane z serializacją DateTime. Zamiast tego należy użyć JSON.Net i wdrożyć MediaTypeFormatter, który używa JSON.Net zamiast DataContractJsonSerializer. Sprawdź moją odpowiedź na podobne pytanie here.