2009-07-10 15 views
7

Mam usługa sieci Web z metodą, która jest wywoływana za pośrednictwem obiektu xmlhttprequest w moim javascript. Metoda przyjmuje parametr datetime, który jest następnie konwertowany na ciąg znaków i uruchamiany w bazie danych w celu przeprowadzenia obliczeń.Właściwy format daty w usłudze sieci Web

uzyskać wartość od m_txtDateAdd i wysłać off XMLHttpRequest

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

który ma walidator attacted niej

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

Moje WebMethod wyglądać tak

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

I użyj sqlDateString jako część texttext i wyślij do bazy danych. Jest to starsza aplikacja i wbudowany sql, więc nie mam wolności do skonfigurowania procedury przechowywanej i tworzenia i przypisywania parametrów w moim kodzie. Działa to w 90% przypadków. Usługa sieciowa jest wywoływana w zdarzeniu onchange z m_txtDateAdd. Co jakiś czas odpowiedź otrzymywana z serwera to:

System.ArgumentException: Nie można przekonwertować 25/06/2009 na System.DateTime. System.ArgumentException: Nie można przekonwertować 25/06/2009 na System.DateTime.

Nazwa parametru: type ---> System.FormatException: String nie został rozpoznany jako poprawny DateTime.

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

Czy można wyświetlić niestandardowy kod weryfikatora? Serializator spróbuje przekonwertować twój ciąg znaków przy użyciu domyślnego formatowania, które może zrozumieć tylko kilka podstawowych formatów. Walidator powinien zapewnić przesłanie znanego formatu. –

+0

Jest to standardowy walidator niestandardowy asp.net. Nie napisałem własnego – user48408

Odpowiedz

10

Musisz wysłać DateTime w poprawnym formacie XML: 2009-07-10T12: 40Z. Od http://en.wikipedia.org/wiki/ISO_8601.


Ponadto, dlaczego używasz HttpRequest? Dlaczego nie po prostu użyć opcji Dodaj usługę?

+0

Nie ma "prawidłowego formatu dla XML", ale istnieje poprawny format schematu XML. Uważaj, aby nie połączyć tych dwóch elementów. Jeśli konsument XML jest klientem javascript, format daty ISO może nie być przydatny. – skaffman

+0

Jego serwis akceptuje DateTime. XML Serializer zawsze używa formatów XSD do deserializacji i serializacji, chyba że zaimplementowano IXmlSerializable, którego nie ma w DateTime. –

+0

Ważną rzeczą do zapamiętania jest to, że dane są zwracane z powodzeniem ponad 90% czasu. Wielokrotna zmiana daty ostatecznie doprowadzi do wyjątku, ale nie ma konsekwencji w tym, że wpisanie raz w roku 01/07/2009 spowoduje niepowodzenie. używając xmlhttprequest, więc nie otrzymasz pełnego odświeżenia strony – user48408

0

Czy przekazujesz wartość ciągu z pola tekstowego bezpośrednio do usługi internetowej? Byłoby bardziej wiarygodne, gdybyśmy analizowali ciąg znaków wejściowych użytkownika w obiekcie daty javascript, przekazywali obiekt Date do usługi sieciowej i pozwalali serializatorowi w bibliotece ajaxów Microsoftu dowiedzieć się, jak je sformatować.

Pomocne może być wyświetlenie kodu javascript po stronie klienta, który pobiera wartość i wywołuje usługę sieci Web.

3

2001-10-26T19: 32: 52Z

Zastosowanie takiego formatu.