2009-07-10 37 views
7

Tôi có một webservice với một phương thức được gọi thông qua đối tượng xmlhttprequest trong javascript của tôi. Phương thức này chấp nhận một tham số datetime mà sau đó được chuyển đổi thành một chuỗi và chạy với cơ sở dữ liệu để thực hiện một phép tính.Định dạng ngày giờ đúng cho dịch vụ web

tôi nhận được giá trị từ m_txtDateAdd và gửi ra khỏi XMLHttpRequest

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

trong đó có một validator attacted để nó

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

WebMethod của tôi trông giống như sau

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

tôi sử dụng sqlDateString như một phần của văn bản lệnh tôi gửi đến cơ sở dữ liệu. Một ứng dụng kế thừa của nó và sql nội tuyến của nó vì vậy tôi không có quyền tự do thiết lập một thủ tục được lưu trữ và tạo và gán các tham số trong mã của tôi phía sau. Điều này làm việc 90% thời gian. Webservice được gọi trên sự kiện onchange của m_txtDateAdd. Hiện tại, tôi nhận được phản hồi từ máy chủ là

System.ArgumentException: Không thể chuyển đổi 25/06/2009 thành System.DateTime. System.ArgumentException: Không thể chuyển đổi 25/06/2009 thành System.DateTime.

Tên thông số: loại ---> System.FormatException: Chuỗi không được nhận dạng là Ngày giờ hợp lệ.

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

Bạn có thể hiển thị mã trình xác thực tùy chỉnh không? Bộ nối tiếp sẽ cố gắng chuyển đổi chuỗi của bạn bằng định dạng mặc định mà chỉ có thể hiểu một vài định dạng cơ bản. Trình xác thực phải đảm bảo rằng định dạng đã biết đang được gửi. –

+0

Trình kiểm tra tùy chỉnh asp.net tiêu chuẩn của nó. Tôi chưa viết cho riêng mình – user48408

Trả lời

10

Bạn cần gửi DateTime theo định dạng đúng cho XML: 2009-07-10T12: 40Z. Từ http://en.wikipedia.org/wiki/ISO_8601.


Ngoài ra, tại sao bạn sử dụng HttpRequest? Tại sao không chỉ sử dụng Thêm tham chiếu dịch vụ?

+0

Không có "định dạng đúng cho XML", nhưng có một định dạng đúng cho Lược đồ XML. Cẩn thận không làm xáo trộn cả hai. Nếu người tiêu dùng XML là một ứng dụng javascript, định dạng ngày ISO có thể không hữu ích. – skaffman

+0

Dịch vụ của anh ấy chấp nhận DateTime. XML Serializer luôn sử dụng các định dạng XSD để deserialize và serialize, trừ khi IXmlSerializable được thực hiện, mà nó không phải trên DateTime. –

+0

Điều quan trọng cần nhớ là tôi đã nói dữ liệu được trả về thành công 90% + thời gian. Liên tục thay đổi ngày cuối cùng sẽ mang lại ngoại lệ nhưng không có sự nhất quán trong đó nói rằng nhập 01/07/2009 hơn và hơn cuối cùng sẽ gây ra nó thất bại. sử dụng xmlhttprequest để bạn không làm mới toàn bộ trang – user48408

0

Bạn có chuyển giá trị chuỗi từ hộp văn bản trực tiếp đến webservice không? Nó sẽ là đáng tin cậy hơn để phân tích cú pháp chuỗi đầu vào của người dùng thành một đối tượng Ngày javascript, chuyển đối tượng Date tới webservice và để cho trình serializer trong thư viện ajax của Microsoft tìm ra cách định dạng nó.

Có thể hữu ích khi xem mã javascript phía máy khách đang nhận giá trị và gọi dịch vụ web.

3

2001-10-26T19: 32: 52Z

Sử dụng định dạng như vậy.

Các vấn đề liên quan