2014-12-05 11 views
10

Wstęp:ASP.NET Parse DateTime wynik od ajax wywołanie javascript data

Mam WebMethod na mojej stronie ASP.NET, która zwraca Person obiekt. Jednym z pól jest Birthday, który jest własnością DateTime.

WebMethod

[WebMethod] 
public static Person GetPerson() 
{ 
    Person p = new Person() { 
     Id = 1, 
     Name = "Test", 
     Birthday = new DateTime(1988, 9, 13) 
    }; 

    return p; 
} 

Jeśli zrobię wezwanie użyciu $.ajax() uzyskać odpowiedź serwera z obiektem Person.

Ajax wywołanie

// Class instance 
var Ajaxcalls = function() { 

} 

_$.extend(Ajaxcalls, { 
    GetPerson: function (label) { 
     var self = label instanceof _$ ? label : $(label); 

     _$.ajax({ 
      url: 'Default.aspx/GetPerson', 
      type: "POST", 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      success: function (data) { 
       console.log(JSON.stringify(data.d)); 
       self.html(new Date(Date.parse(data.d.Birthday))); 
      } 
     }); 
    } 
}); 

Wynik:

{"__type":"AjaxTest.Classes.Person","Id":1,"Name":"Test","Birthday":"/Date(590104800000)/"} 

Problem

Jak zrobić Przetwarzam Birthday [/ Date (590104800000) /] na datę javascript/jQuery? Próbowałem new Date(Date.parse(data.d.Birthday)), ale to daje mi Invalid date.

+0

spróbuj tego kodu w swoim webmethod Birthday = new DateTime (1988, 9, 13) .ToLongDateString(); –

+0

Urodziny są typu DateTime, więc nie mogę ich przetworzyć na ciąg znaków – Mivaweb

+0

Śledź ten [blog] (http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx) – chridam

Odpowiedz

18

Zastosowanie ToJavaScriptDate() funkcja, która robi to za ciebie:

Przykład

function ToJavaScriptDate(value) { 
    var pattern = /Date\(([^)]+)\)/; 
    var results = pattern.exec(value); 
    var dt = new Date(parseFloat(results[1])); 
    return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear(); 
} 

Funkcja ToJavaScriptDate() przyjmuje wartość w/Date (ticks)/format i zwraca ciąg daty w formacie MM/dd/rrrr. Wewnątrz funkcja ToJavaScriptDate() używa wyrażenia regularnego, które reprezentuje wzór/datę (([^)] +)) /. Metoda exec() akceptuje wartość daty źródłowej i testuje dopasowanie w wartości. Wartością zwracaną przez exec() jest tablica. W tym przypadku drugi element tablicy wyników (wyniki 1) przechowuje znacznik części daty źródłowej. Na przykład, jeśli wartością źródłową jest/Data (836418600000)/wtedy wyniki 1 będą 836418600000. Na podstawie tej wartości tyknięć powstaje obiekt Data JavaScript. Obiekt Date posiada konstruktor, który akceptuje liczbę milisekund od 1 stycznia 1970. W ten sposób dt przechowuje poprawny obiekt JavaScript Date. Funkcja ToJavaScriptDate() formatuje datę jako MM/dd/rrrr i wraca do wywołującego. Można użyć funkcji ToJavaScriptDate(), jak pokazano poniżej:

options.success = function (order) { 
alert("Required Date : " + ToJavaScriptDate(order.RequiredDate) + ", Shipped Date : " + ToJavaScriptDate(order.ShippedDate)); 
}; 

Chociaż powyższy przykład wykorzystuje datę w MM/dd/rrrr formacie, jesteś wolny, aby używać innego formatu raz Data obiekt jest zbudowany.

referencyjny: Link

1

Można spróbować to:

_$.ajax({ 
     url: 'Default.aspx/GetPerson', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      console.log(JSON.stringify(data.d)); 
      var src = data.d.Birthday; 
      //Remove all non-numeric (except the plus) 
      src = src.replace(/[^0-9 +]/g, ''); 
      //Create date 
      var birthDate = new Date(parseInt(src)); 
      self.html(birthDate); 
     } 
    }); 

JSFiddle

+1

Twoje rozwiązanie działa również dla mnie! +1 – Mivaweb

1

Innym sposobem rozwiązania tego problemu jest, aby nowy element w swojej klasie osoby, a następnie użyć że. Przykład

public class Person { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public DateTime Birthday {get;set;} 
    public string BirthdayFormat { get { 
     return Birthday.toString("dd/MM/YYYY") 
    }} 
} 

Myślę, że to byłby najlepszy sposób, ponieważ wtedy wszystkie formowania są w jednym miejscu i tam, gdzie to możliwe. [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/YYYY}")]

Powyżej elementu Urodziny, tak aby displayFor używał poprawnego formatowania.