2015-09-14 12 views
5

Attualmente i metodi web o la maggior parte dei metodi in .NET classica ASP serializza utilizzando system.web.script.serialization.javascriptserializer classe e questo restituisce membri datetime dell'oggetto JavaScript con valori comeEsiste un modo per restituire DateTime in formato ISO da un metodo web asp .net invece che in formato JSON?

"/ Data (numero di zecche)/"

. Capisco che questo è un problema infame e molte persone suggeriscono di utilizzare alcuni tipi di convertitori dopo aver ricevuto i dati o restituire i dati come stringa anziché come oggetti.

Ad esempio la classe

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

se restituito tramite uno System.Web.Services.WebMethod con [ScriptMethod (ResponseFormat = ResponseFormat.Json)] decorazione, la risposta sarà restituito come sotto del risultato. d

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

E abbiamo bisogno di applicare del codice per convertire il DOB in formato ISO o qualche altro formato accettabile.

Ma sto solo cercando di capire se qualcuno ha eseguito una sorta di risposta modificando o utilizzando una classe sovrascritta per restituire i valori DateTime dai metodi web. C'è un modo per scavalcare le funzionalità di javascriptserializer e usarlo nei metodi asp .net web in modo che restituisca la data direttamente nel formato ISO? Sono consapevole che può essere fatto in asp .net MVC in vari modi.

È lo stesso che si può fare nei metodi web del modulo web asp .net? Ciò farebbe risparmiare molto codice e bug :)

+1

è possibile scrivere il proprio serial json personalizzato utilizzando newtonsoft –

+0

sì, ma come si dice al WebMethod di utilizzare questo nuovo serializzatore personalizzato per restituire l'oggetto. Non voglio restituirlo come una stringa :( – Muthu

+1

ISO * è * il formato JSON. Stai utilizzando il (deprecato) JavaScriptSerializer forse? –

risposta

-3

Puoi facilmente dichiarare il tipo di risposta in webmethod. Inoltre è possibile utilizzare serializzatore personalizzato come descritto in questo link o vedere follwoing codice su come formattare una data:

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

Penso che il tipo di risposta sia già quello giusto, a quale OP non piace è il formato per le date ... –

+0

@AdrianoRepetti quindi vuol dire che puoi dedicare la mia risposta? Hai letto completamente la mia risposta? –

+0

FYI (per quello che conta) non ho minimizzato la tua risposta ma sì l'ho completamente letto e anche dopo la seconda lettura non capisco che tipo di risposta ha a che fare con la domanda ... –

2

ho trovato un trucco da http://blog.icanmakethiswork.io/2012/04/beg-steal-or-borrow-decent-javascript.html.

Questo è per sostituire il serializzatore della data di JsonSerializer e utilizzare il serializzatore di data personalizzato.

  • Override l'System.Web.Script.Serialization.JavaScriptConverter
  • sezione Aggiornamento web.config per applicare questo per tutto il progetto o utilizzare la funzione RegisterConverters per il suo utilizzo a livello locale

Questo è in grado di restituire mi ritorna indietro con una data di formattazione ISO e sono anche in grado di passare questo momento all'interno per manipolazioni all'interno di javascript.