2009-07-10 19 views
7

Tengo un servicio web con un método que se llama mediante un objeto xmlhttprequest en mi javascript. El método acepta un parámetro de fecha y hora que posteriormente se convierte en una cadena y se ejecuta contra la base de datos para realizar un cálculo.Formato correcto de DateTime para un servicio web

consigo el valor de m_txtDateAdd y enviar el XMLHttpRequest

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

que tiene un validador attacted a ella

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

Mi WebMethod ve algo como esto

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

I use sqlDateString como parte del texto de comando que envío a la base de datos. Es una aplicación heredada y su sql en línea, así que no tengo libertad para configurar un procedimiento almacenado y crear y asignar parámetros en mi código. Esto funciona el 90% del tiempo. El servicio web se llama en el evento onchange de m_txtDateAdd. De vez en cuando la respuesta que recibo del servidor es

System.ArgumentException: No se puede convertir 25/06/2009 a System.DateTime. System.ArgumentException: No se puede convertir 25/06/2009 a System.DateTime.

Nombre del parámetro: tipo ---> System.FormatException: String no se reconoció como un DateTime válido.

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

¿Puede mostrar el código del validador personalizado? El serializador intentará convertir su cadena utilizando el formato predeterminado, que solo puede comprender unos pocos formatos básicos. El validador debe garantizar que se envíe un formato conocido. –

+0

Es un validador personalizado asp.net estándar. No he escrito el mío – user48408

Respuesta

10

Debe enviar un DateTime en el formato correcto para XML: 2009-07-10T12: 40Z. De http://en.wikipedia.org/wiki/ISO_8601.


Además, ¿está usted utilizando HttpRequest? ¿Por qué no usar Add Reference Reference?

+0

No hay un "formato correcto para XML", pero hay un formato correcto para el Esquema XML. Cuidado de no combinar los dos. Si el consumidor de XML es un cliente de JavaScript, el formato de fecha ISO puede no ser útil. – skaffman

+0

Su servicio acepta DateTime. XML Serializer siempre usa formatos XSD para deserializar y serializar, a menos que se implemente IXmlSerializable, que no está en DateTime. –

+0

Es importante recordar que dije que los datos se devolvieron con éxito el 90% + del tiempo. La modificación repetida de la fecha eventualmente arrojará la excepción, pero no hay consistencia en que, digamos, ingresar 01/07/2009 una y otra vez eventualmente hará que falle. utilizando xmlhttprequest para que no obtenga una actualización de página completa – user48408

0

¿Está transfiriendo el valor String del cuadro de texto directamente al servicio web? Sería más confiable analizar la cadena de entrada del usuario en un objeto de fecha de JavaScript, pasar el objeto de fecha al servicio web y dejar que el serializador en la biblioteca ajax de Microsoft descubra cómo formatearlo.

Puede ser útil ver el código javascript del lado del cliente que está obteniendo el valor y llamando al servicio web.

3

2001-10-26T19: 32: 52Z

Uso dicho formato.

Cuestiones relacionadas