2015-09-14 7 views
5

Derzeit wird die Web-Methoden oder die meisten Methoden in klassischen Asp .net serialisiert system.web.script.serialization.javascriptserializer-Klasse, und dies gibt das so Datetime-Mitglieder mit den Werten der Javascript-Objekts alsGibt es eine Möglichkeit, DateTime im ISO-Format von einer asp.net-Webmethode anstelle von JSON-Format zurückzugeben?

„/ Datum (Anzahl der Ticks)/"

. Ich verstehe, dass dies ein berüchtigtes Problem ist, und die meisten Leute schlagen vor, eine Art von Konvertern zu verwenden, nachdem wir die Daten erhalten haben oder die Daten als String anstelle von Objekten zurückgeben.

Zum Beispiel der Klasse

public class Person 
{ 
    public String Name { get; set; } 
    public int Age { get; set; } 
    public DateTime DOB { get; set; } 
} 

wenn über eine System.Web.Services.WebMethod kehrte mit einer [Script (Responseformat = ResponseFormat.Json)] Dekoration, wird die Antwort, wie unten in Folge zurückgeführt werden. d

{Name:"Steve", Age:30, DOB:"/Date(1249335477787)/"}; 

Und wir müssen etwas Code anwenden, um das DOB in ISO-Format oder ein anderes akzeptables Format zu konvertieren.

Aber ich versuche nur zu sehen, ob jemand eine Art von Antwort Tweaking getan hat oder eine überforderte Klasse verwendet, um die DateTime-Werte von Web-Methoden zurückzugeben. Gibt es eine Möglichkeit, die Funktionalität des Javascriptserializers zu übersteuern und sie in asp.net-Webmethoden zu verwenden, so dass sie das Datum direkt im Format ISO zurückgibt? Ich bin mir bewusst, dass es in Asp.NET MVC in ein paar Möglichkeiten getan werden kann.

Ist das gleiche in ASP Web-Form Web-Methoden getan werden? Das würde eine Menge Code und Fehler sparen :)

+1

Sie können Ihre eigenen benutzerdefinierten Json Serializier mit newtonsoft –

+0

ja schreiben, aber wie sage ich der WebMethod diesen neuen benutzerdefinierten Serializer verwenden, um das Objekt zurückzugeben. Ich möchte es auch nicht als String zurückgeben :( – Muthu

+1

ISO * ist * das JSON-Format. Verwenden Sie den (veralteten) JavaScriptSerializer vielleicht? –

Antwort

-3

Sie können den Antworttyp einfach in webmethod deklarieren. Sie können auch benutzerdefinierte Serializer verwenden wie in diesem link beschrieben oder follwoing Code auf wie ein Datum zu formatieren:

class DualDateJsonConverter : JsonConverter 
{ 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 

     JObject result = new JObject(); 

     DualDate dd = (DualDate)value; 

     result.Add("DateOne", JToken.FromObject(dd.DateOne.ToString("MM.dd.yyyy"))); 
     result.Add("DateTwo", JToken.FromObject(dd.DateTwo)); 
     result.WriteTo(writer); 
    } 

    // Other JsonConverterMethods 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DualDate); 
    } 

    public override bool CanWrite 
    { 
     get 
     { 
      return true; 
     } 
    } 
    public override bool CanRead 
    { 
     get 
     { 
      return false; 
     } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
Context.Response.ContentType = "application/json"; 
Context.Response.Write(response); 
+0

Ich denke, der Antworttyp ist schon der richtige, was OP nicht mag ist Format für Daten ... –

+0

@AdrianoRepetti also bedeutet es, dass Sie meine Antwort widmen können? Haben Sie meine Antwort vollständig gelesen? –

+0

FYI (für was es wichtig ist) Ich habe Ihre Antwort nicht abgelehnt, aber ja, ich lese es vollständig und auch nach dem zweiten Lesen verstehe ich nicht, was Antworttyp mit Frage zu tun hat ... –

2

ich einen Trick aus http://blog.icanmakethiswork.io/2012/04/beg-steal-or-borrow-decent-javascript.html gefunden.

Dies ist die JSerializer eigenen Datums-Serialisierer zu ersetzen und den benutzerdefinierten Datums-Serializer verwenden.

  • Aufschalten des System.Web.Script.Serialization.JavaScriptConverter
  • aktualisieren web.config Abschnitt dieses gesamtes Projekt anwenden oder RegisterConverters Funktion für lokal

mit dieser ist in der Lage zurückzukehren Ich habe eine ISO-formatierte Datum Zeit und ich bin auch in der Lage, diesen inneren Moment js für Manipulationen innerhalb von Javascript zu übergeben.