2009-07-10 17 views
7

Ho un servizio web con un metodo che viene chiamato tramite un oggetto xmlhttprequest nel mio javascript. Il metodo accetta un parametro datetime che viene successivamente convertito in una stringa ed eseguito contro il database per eseguire un calcolo.Formato DateTime corretto per un servizio Web

ottengo il valore da m_txtDateAdd e inviare il XMLHttpRequest

<asp:textbox id=m_txtDateAdd tabIndex=4 runat="server" Width="96px" Text="<%# Today %>"> 
</asp:textbox> 

che ha un validatore attacted ad esso

<asp:CustomValidator id="m_DateAddValidator" runat="server" ErrorMessage="Please Enter a Valid Date" ControlToValidate="m_txtDateAdd">&#x25CF;</asp:CustomValidator> 

mio webmethod simile a questa

[WebMethod] 
public decimal GetTotalCost(DateTime transactionDate) 
{ 
    String sqlDateString = transactionDate.Year+"/"+transactionDate.Month+"/"+transactionDate.Day; 

I usa sqlDateString come parte del comando che invio al database. È un'applicazione legacy e il suo sql in linea, quindi non ho la libertà di impostare una procedura memorizzata e creare e assegnare parametri nel mio codice. Questo funziona il 90% delle volte. Il servizio web viene chiamato sull'evento onchange di m_txtDateAdd. Ogni tanto la risposta che ottengo dal server è

System.ArgumentException: Impossibile convertire 25/06/2009 a System.DateTime. System.ArgumentException: Impossibile convertire 25/06/2009 in System.DateTime.

Nome parametro: tipo ---> System.FormatException: la stringa non è stata riconosciuta come DateTime valido.

at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) 
    at System.DateTime.Parse(String s, IFormatProvider provider) 
    at System.Convert.ToDateTime(String value, IFormatProvider provider) 
    at System.String.System.IConvertible.ToDateTime(IFormatProvider provider) 
    at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
    at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) 
    --- End of inner exception stack trace --- 
    at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) 
    at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) 
    at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request) 
    at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() 
    at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 
+0

Puoi mostrare il codice del validatore personalizzato? Il serializzatore tenterà di convertire la stringa utilizzando la formattazione predefinita che può solo comprendere alcuni formati di base. Il validatore deve assicurarsi che venga inviato un formato noto. –

+0

È un validatore personalizzato asp.net standard. Non ho scritto il mio proprio – user48408

risposta

10

è necessario inviare un DateTime nel formato corretto per XML: 2009-07-10T12: 40Z. Da http://en.wikipedia.org/wiki/ISO_8601.


Inoltre, perché stai usando HttpRequest? Perché non usare solo Aggiungi riferimento al servizio?

+0

Non esiste un "formato corretto per XML", ma esiste un formato corretto per lo schema XML. Attento a non confondere i due. Se il consumatore dell'XML è un client javascript, il formato della data ISO potrebbe non essere utile. – skaffman

+0

Il suo servizio accetta DateTime. Serializer XML usa sempre i formati XSD per deserializzare e serializzare, a meno che IXmlSerializable non sia implementato, che non è su DateTime. –

+0

Una cosa importante da ricordare che ho detto che i dati vengono restituiti con successo il 90% + del tempo. La modifica ripetuta della data alla fine produrrà l'eccezione, ma non vi è alcuna coerenza nel senso che inserire l'01/07/2009 più e più volte causerà il fallimento. usando xmlhttprequest in modo da non ottenere un aggiornamento completo della pagina – user48408

0

Stai passando il valore di stringa dalla casella di testo direttamente al servizio web? Sarebbe più affidabile analizzare la stringa di input dell'utente in un oggetto Date javascript, passare l'oggetto Date al servizio web e lasciare che il serializzatore nella libreria ajax di Microsoft capisca come formattarlo.

Potrebbe essere utile vedere il codice javascript lato client che sta ottenendo il valore e chiamando il servizio web.

3

2001-10-26T19: 32: 52Z

Usa tale formato.

Problemi correlati