2010-10-14 7 views
20

Używam kalendarza jQuery do wyświetlania zdarzeń, które są przeznaczone do pobierania danych z serwera. Podczas innit kalendarz odpala żądanie AJAX, aby uzyskać tablicę obiektów zdarzeń (zakodowanych przez Json). Jak dotąd wszystko dobrze. Jednak to żądanie zawiera datę i godzinę zakodowaną w JSON (w miejscach, w których moja implementacja ma miejsce). Kod wygląda następująco:ASP.NET MVC - przekazywanie JSON DateTime do kontrolera niepowiązanego z parametrami kontrolera

data: function (start, end, callback) { 
     $.post('/planner/GetPlannerEvents', { test: "test", start: JSON.stringify(start), end: JSON.stringify(end) }, function (result) { callback(result); }); 
    } 

Deklaracja dla metody kontrolera GetPlannerEvents wygląda następująco:

public ActionResult GetPlannerEvents(DateTime start, DateTime end) 

Problemem jest to, że asp.net mvc 2 nie może wydawać się automatycznie zanalizować json zakodowany datetime i jako taki narzeka, że ​​wartości początkowe i końcowe są zerowe.

Czy jest inna metoda, której powinienem użyć, aby przekazać daty javascript do serwera, aby mogły zostać poprawnie przetworzone?

Dzięki,

+0

Czy istnieje jakiś powód, dla którego używasz JSON.stringify? Jakie są wartości sprzed tego połączenia? – Jab

+0

regularne daty javascript. Wydaje mi się, że na demo użyłem JSON.stringify, ale tak naprawdę nie ma żadnego prawdziwego powodu, aby go użyć. – Sergio

Odpowiedz

48

Nie powinno być JSON kodowania daty z stringify ponieważ domyślny segregator modelu nie oczekuje JSON. Wypróbuj to:

$.post('/planner/GetPlannerEvents', { start: start.toUTCString(), 
    end: end.toUTCString() }, function (result) { 
    callback(result); 
}); 
+1

Znowu Darin, robisz mój dzień! – Samuel

+1

Warto zauważyć, że kontroler oczekuje parametru string, a nie DateTime. –

+0

Chciałbym, żeby ta odpowiedź miała więcej głosów. Trudno jest kopać stos pytań dotyczących kontrolerów MVC. Nie mogę uwierzyć, że TOUTCString() było odpowiedzią. Rekwizyty! – tranceporter

-5

Trzeba użyć typ zwracany jako 1JsonResult1s zamiast 1ActionResult1s

kod idzie somthing jak ten

public JasonResult(DateTime start, DateTime end) { 
    //some logic 
    return Json(); // you can pass any values within Json() with new keyword 
} 
+2

dziękuję, ale wynik json to wynik działania – Sergio

7

Spróbuj użyć date.toISOString() do przekazania danych do serwera. Zwraca ciąg w formacie ISO8601. Również ta metoda może być używana do formatowania dat używania w URI.

$.post('/planner/GetPlannerEvents', { start: start.toISOString(), 
    end: end.toISOString() }, function (result) { 
    callback(result); 
}); 

Dlaczego toISOString jest lepsza niż toUTCString?
toUTCString Konwertuje do czytelny dla człowieka ciąg w strefie czasowej UTC.
toISOString Konwertuje na uniwersalny format ISO, który pozwala rozwiązać problem z ustawieniami regionalnymi i różnymi formatami.

+0

Całkowicie zgadzam się, że ISO jest dużo bardziej niezawodne i spójne niż UTC na różnych maszynach z różnymi ustawieniami lokalizacji. – MazBros

0

Wersje date.toString nie działały dla mnie, dopóki nie dodałem nagłówków json do postu. Wynikowy kod jest następujący:

var pstData = { 
    begDate: date1.toUTCString(), 
    endDate : date2.toUTCString() 
}; 

$.ajax({ 
    url:'url', 
    type:'POST', 
    data: JSON.stringify(pstData), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
}) 
Powiązane problemy