Mam działanie kontrolera, które skutecznie po prostu zwraca JsonResult mojego modelu. Tak więc w mojej metodzie mam coś takiego:
return new JsonResult(myModel);
Działa to dobrze, z wyjątkiem jednego problemu. W modelu znajduje się właściwość date, która wydaje się zwracana w wyniku Jsona w następujący sposób:
"\/Date(1239018869048)\/"
Jak powinienem postępować z datami, aby były one zwracane w wymaganym przeze mnie formacie? Lub jak obsłużyć ten format powyżej w skrypcie?
javascript
asp.net-mvc
json
Jon Archway
źródło
źródło
Odpowiedzi:
Aby rozwinąć odpowiedź casperOne .
Specyfikacja JSON nie uwzględnia wartości daty. MS musiało zadzwonić, a wybraną przez nich ścieżką było wykorzystanie małej sztuczki w javascriptowej reprezentacji ciągów: literał łańcuchowy „/” jest taki sam jak „\ /”, a literał łańcuchowy nigdy nie zostanie zserializowany do „ \ / ”(nawet„ \ / ”należy zmapować na„ \\ / ”).
Aby uzyskać lepsze wyjaśnienie, zobacz http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 (przewiń w dół do „Od literałów JavaScript do JSON”)
Rozwiązaniem byłoby po prostu przeanalizować:
Jednak słyszałem, że istnieje ustawienie, w którym serializator może wypisywać
DateTime
obiekty zenew Date(xxx)
składnią. Spróbuję to wykopać.Drugi parametr
JSON.parse()
akceptujereviver
funkcję, w której określa, w jaki sposób wartość pierwotnie została wygenerowana, zanim zostanie zwrócona.Oto przykład daty:
Zobacz dokumentację JSON.parse ()
źródło
parseInt()
. Mówi funkcji, aby wyodrębnić liczbę całkowitą w systemie liczbowym base 10. To podstawa. Jeśli8
tam wstawisz , wyodrębni to liczbę ósemkową.Oto moje rozwiązanie w Javascripcie - bardzo podobne do JPota, ale krótsze (i być może trochę szybsze):
„value.substr (6)” usuwa część „/ Date (”), a funkcja parseInt ignoruje znaki nienumeryczne występujące na końcu.
EDYCJA: Celowo pominąłem podstawkę (drugi argument do analizy); zobacz mój komentarz poniżej . Należy również pamiętać, że daty ISO-8601 są preferowane w stosunku do tego starego formatu - dlatego ten format zasadniczo nie powinien być używany do nowego programowania. Zobacz doskonałą bibliotekę Json.NET, która stanowi doskonałą alternatywę szeregowania dat przy użyciu formatu ISO-8601.
W przypadku dat JSON sformatowanych według ISO-8601 wystarczy przekazać ciąg do konstruktora daty:
źródło
value.substr(6, 13)
do usuwania innych znaków nieliczbowych. Ale jeśli to zrobisz, wszystkie daty PRZED 26.04.1938 są nieprawidłowe! Nie wiedzieliśmy,parseInt
że zignorujemy znaki nienumeryczne. Dzięki!parseInt
powinien ignorować wiodące zera od ECMAScript ed 5 (2011).Istnieje wiele odpowiedzi, aby poradzić sobie z tym po stronie klienta, ale możesz zmienić stronę serwera wyjściowego, jeśli chcesz.
Można podejść do tego na kilka sposobów, zacznę od podstaw. Będziesz musiał podklasować klasę JsonResult i zastąpić metodę ExecuteResult. Następnie możesz zastosować kilka różnych metod zmiany serializacji.
Podejście 1: Domyślna implementacja używa JsonScriptSerializer . Jeśli spojrzysz na dokumentację, możesz użyć metody RegisterConverters, aby dodać niestandardowe JavaScriptConverters . Jest jednak kilka problemów: JavaScriptConverter serializuje do słownika, to znaczy, że pobiera obiekt i serializuje do słownika Json. Aby obiekt został przekształcony do postaci szeregowej w ciąg, wymaga nieco hakowania, patrz post . Ten konkretny hack również ucieknie od łańcucha.
Podejście 2 (zalecane): Drugim podejściem jest rozpoczęcie od zastąpionego JsonResult i przejście do innego serializatora Json, w moim przypadku serializatora Json.NET . To nie wymaga hackery podejścia 1. Oto moja implementacja podklasy JsonResult:
Przykład użycia:
Dodatkowe kredyty: James Newton-King
źródło
Moment.js to obszerna biblioteka datetime, która również to obsługuje. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
np .: moment („/ Date (1198908717056-0700) /”)
To może pomóc. wyjście plunkera
źródło
moment("json_date_string_value").format('appropriate format');
, możesz zobaczyć różne wartości formatu na stronieOkazało się, że tworząc nowy
JsonResult
i powrocie, że jest niezadowalająca - konieczności wymiany wszystkich połączeń doreturn Json(obj)
zreturn new MyJsonResult { Data = obj }
jest ból.Pomyślałem więc, dlaczego nie po prostu porwać
JsonResult
użycieActionFilter
:Można to zastosować do dowolnej metody zwracającej
JsonResult
zamiast niej JSON.Net:który odpowie
zgodnie z życzeniem!
Możesz, jeśli nie masz nic przeciwko wywoływaniu
is
porównania przy każdym żądaniu, dodaj to doFilterConfig
:a cały JSON będzie teraz serializowany za pomocą JSON.Net zamiast wbudowanego
JavaScriptSerializer
.źródło
Używanie jQuery do automatycznego konwertowania dat za pomocą
$.parseJSON
Ponieważ używasz Asp.net MVC, podejrzewam, że używasz jQuery po stronie klienta. Sugeruję przeczytanie tego posta na blogu, który zawiera kod
$.parseJSON
umożliwiający automatyczne konwertowanie dat.Kod obsługuje daty w formacie Asp.net, takie jak te, o których wspomniałeś, a także daty w formacie ISO. Wszystkie daty zostaną automatycznie sformatowane za pomocą
$.parseJSON()
.źródło
Komunikacja Ajax między klientem a serwerem często obejmuje dane w formacie JSON. Chociaż JSON działa dobrze dla ciągów, liczb i boolanów, może powodować pewne trudności dla dat ze względu na sposób serializacji ich przez ASP.NET. Ponieważ nie ma żadnej specjalnej reprezentacji dat, są one serializowane jako ciągi zwykłe. Jako rozwiązanie domyślny mechanizm serializacji ASP.NET Web Forms i MVC serializuje daty w specjalnej formie - / Date (tiki) / - gdzie tiki to liczba milisekund od 1 stycznia 1970 roku.
Ten problem można rozwiązać na 2 sposoby:
Strona klienta
Konwertuj otrzymany ciąg daty na liczbę i utwórz obiekt daty za pomocą konstruktora klasy daty z paskami jako parametrem.
po stronie serwera
Poprzednie rozwiązanie używa skryptu po stronie klienta do konwersji daty na obiekt Date JavaScript. Można również użyć kodu po stronie serwera, który serializuje instancje .NET DateTime w wybranym formacie. Aby wykonać to zadanie, musisz utworzyć swój własny ActionResult, a następnie serializować dane tak, jak chcesz.
odniesienie: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
źródło
Miałem ten sam problem i zamiast zwrócić rzeczywistą wartość daty, użyłem na nim ToString („dd MMM rrrr”). Następnie w moim javascript użyłem nowej daty (datevalue), gdzie wartością daty może być „01 stycznia 2009”.
źródło
ToString("o")
?Zobacz ten wątek:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Zasadniczo, chociaż
Date()
format jest prawidłowym skryptem javascript, NIE JEST to poprawny JSON (istnieje różnica). Jeśli chcesz mieć stary format, prawdopodobnie będziesz musiał stworzyć fasadę i samodzielnie przekształcić wartość lub znaleźć sposób na uzyskanie serializatora dla swojego typu wJsonResult
i użycie niestandardowego formatu dat.źródło
Nie jest to najbardziej elegancki sposób, ale działało to dla mnie:
źródło
Pracowałem nad rozwiązaniem tego problemu, ponieważ żadna z powyższych odpowiedzi mi nie pomogła. Pracuję z kalendarzem tygodnia jquery i potrzebowałem, aby moje daty zawierały informacje o strefie czasowej na serwerze i lokalnie na stronie. Po dłuższym przekopaniu się wymyśliłem rozwiązanie, które może pomóc innym.
Korzystam z asp.net 3.5, vs 2008, asp.net MVC 2 i kalendarza tygodnia jquery,
Po pierwsze, korzystam z biblioteki napisanej przez Stevena Levithana, która pomaga radzić sobie z datami po stronie klienta, biblioteki dat Stevena Levithana . Format isoUtcDateTime jest idealny do tego, czego potrzebowałem. W moim wywołaniu AJAX jquery korzystam z funkcji formatowania dostarczonej z biblioteką w formacie isoUtcDateTime, a gdy wywołanie ajax trafia w moją metodę akcji, rodzaj datetime jest ustawiony na lokalny i odzwierciedla czas serwera.
Kiedy wysyłam daty na moją stronę za pośrednictwem AJAX, wysyłam je jako ciągi tekstowe, formatując daty przy użyciu „ddd, dd MMM rrrr GG:„ mm ”:„ ss ”GMT'zzzz”. Ten format można łatwo przekonwertować po stronie klienta
Oto moje kompletne rozwiązanie bez źródła Steve'a Levithana, które można pobrać:
Kontroler:
JavaScript:
Mam nadzieję, że ten szybki przykład pomoże innym w tej samej sytuacji, w której byłem. Wydaje się, że obecnie działa bardzo dobrze z serializacją JSON firmy Microsoft i utrzymuje prawidłowe daty w różnych strefach czasowych.
źródło
Lepszym sposobem obsługi dat w knockoutjs jest użycie biblioteki momentów i obsługa dat takich jak boss. Możesz łatwo poradzić sobie z datami takimi jak / Date (-62135578800000) /. Nie musisz się martwić, w jaki sposób szeregujesz datę w kontrolerze.
użyj tego jak
momentjs obsługuje wiele formatów daty i funkcji narzędziowych w datach.
źródło
Sformatuj datę w zapytaniu.
Jedynym problemem związanym z tym rozwiązaniem jest to, że nie uzyskasz żadnych wyników, jeśli ŻADNA z wartości daty będzie zerowa. Aby obejść ten problem, możesz albo umieścić w zapytaniu instrukcje warunkowe, ZANIM wybierzesz datę, która ignoruje daty zerowe, lub możesz ustawić zapytanie, aby uzyskać wszystkie wyniki, a następnie przejrzeć wszystkie te informacje za pomocą pętli foreach i przypisać wartość do wszystkich dat, które są zerowe PRZED wykonaniem SELECT nowego.
Przykład obu:
Druga opcja wymaga całkowicie innego zapytania, aby można było przypisać wartości do wszystkich wartości null. Ta i pętla foreach musiałyby być PRZED zapytaniem, które wybiera wartości.
Po prostu pomysł, który znalazłem łatwiejszy niż wszystkie przykłady javascript.
źródło
Możesz użyć tej metody:
źródło
0
W twoim cshtml
W twoim pliku JS, może app.js,
Poza app.controller dodaj poniższy filtr.
Tutaj „moja data” to funkcja, którą wywołujesz w celu analizy daty. Tutaj „aplikacja” jest zmienną zawierającą moduł kątowy
źródło
dodaj wtyczkę jquery ui na swojej stronie.
źródło
Nie na darmo, ale jest inny sposób. Najpierw zbuduj zapytanie LINQ. Następnie skonstruuj zapytanie Wyliczony wynik i zastosuj dowolny rodzaj formatowania, który działa dla Ciebie.
Muszę powiedzieć, że dodatkowy krok jest denerwujący, ale działa dobrze.
źródło
To, co zadziałało, to stworzenie viewmodel, który zawierałby właściwość date jako ciąg znaków. Przypisywanie właściwości DateTime z modelu domeny i wywoływanie funkcji .ToString () we właściwości date podczas przypisywania wartości do viewmodel.
Wynik JSON z metody akcji MVC zwróci datę w formacie zgodnym z widokiem.
Zobacz model
Model domeny
Metoda działania kontrolera
źródło
Zastąp kontrolery Json / JsonResult, aby zwrócić JSON.Net:
To działa na ucztę
źródło
Irytujące, prawda?
Moim rozwiązaniem była zmiana usługi WCF, aby zwracała DateTimes w bardziej czytelnym (innym niż Microsoft) formacie. Zauważ poniżej „
UpdateDateOriginal
”, który jest domyślnym formatem dat WCF, i mój „UpdateDate
”, który jest sformatowany na coś bardziej czytelnego.Oto jak to zrobić:
Zmiana formatu daty WCF
Mam nadzieję że to pomoże.
źródło
Uważam, że jest to najłatwiejszy sposób na zmianę tego po stronie serwera.
źródło
Miałem wiele problemów związanych z datami JSON i postanowiłem po prostu pozbyć się problemu, rozwiązując problem daty w SQL. Zmień format daty na ciąg znaków
Używając fldDateStr problem zniknął i nadal mogłem używać pola daty do sortowania lub innych celów.
źródło
Zwraca format daty serwera. Musisz zdefiniować własną funkcję.
źródło
Oto kod JavaScript, który napisałem, który ustawia
<input type="date">
wartość z daty przekazanej z ASP.NET MVC.Nazywasz tę funkcję tak:
Gdzie
commissionStartDate
jest data JSON przekazana przez MVC.źródło
Najłatwiejszy:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = nowa data (milisegundos). toLocaleDateString („en-UE”);
źródło