2009-04-09 34 views
13

Tôi có một phương thức web đơn giản và gọi ajax và tiếp tục nhận được lỗi nói rằng nó không thể chuyển đổi chuỗi thành đối tượng IDictionary ???Truyền tham số tới WebMethod với jQuery Ajax

Đây là cuộc gọi ajax:

var params = '{"ID":"' + rowid + '"}'; 
$.ajax({ 
    url: 'EDI.asmx/GetPartnerDetails', 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(params), 
    dataType: "json", //not json . let me try to parse 
    success: function(msg, st) { . . . . 

Đây là WebMethod:

<WebMethod()> _ 
Public Function GetPartnerDetails(ByVal ID As String) As String 

    'Dim objParam As IDictionary = CType(JsonConvert.DeserializeObject(ID), IDictionary) 
    'Dim rowID As String = objParam("ID") 

    Dim objController As New HealthComp.BLL.X12Partners.TradingPartnersController 
    Dim objInfo As TradingPartnersInfo = objController.FetchByPartnerID(Int32.Parse(ID)) 

    Return JsonConvert.SerializeObject(objInfo) 
End Function 

Dưới đây là những gì tôi nhìn thấy từ Firebug:

Tiêu đề phản hồi
Server: Microsoft-IIS /5.1
Ngày: Thứ năm, 09 tháng 4 năm 2009 21:43:59 GMT
jsonerror: true
Cache-Control: riêng
Loại nội dung: application/json; charset = utf-8
Content-Length: 1331

POST: "{\" ID \ ": \" 4 \ "}"

ỨNG PHÓ:

{ "Message": "Không thể chuyển đổi đối tượng thuộc loại \ u0027System.String \ u0027 để nhập \ u0027System.Collections .Generic.IDictionary`2 [System.String, System.Object] \ u0027 "," StackTrace ":" tại System.Web.Script.Serialization .ObjectConverter.ConvertObjectToTypeInternal (Đối tượng o, Kiểu loại, Trình sắp xếp JavaScriptSerializer, Boolean throwOnError, Object & conversionObject) \ r \ n tại System.Web.Scri pt.Serialization.ObjectConverter.ConvertObjectToTypeMain (Đối tượng o, Loại loại, Trình sắp xếp JavaScriptSerializer, Boolean throwOnError, Đối tượng & transformationObject ) \ r \ n tại System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType (Object o, Loại loại, JavaScriptSerializer serializer) \ r \ n tại System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) \ r \ n tại System.Web.Script.Serialization.JavaScriptSerializer .Deserialize [T] (Chuỗi đầu vào) \ r \ n tại System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext context, JavaScriptSerializer serializer) \ r \ n tại System.Web.Script.Services.RestHandler .GetRawParams (WebServiceMethodData methodD ata, HttpContext ngữ cảnh) \ r \ n tại System.Web.Script.Services .RestHandler.ExecuteWebServiceCall (HttpContext bối cảnh, WebServiceMethodData methodData)", "ExceptionType" : "System.InvalidOperationException"}

Bất cứ ai có bất cứ ý tưởng về điều này? Cảm ơn!!

Trả lời

30

Nhanh mục:

params biến của bạn var params = '{ID:' + rowid + '}'; là một chuỗi.

Vì vậy, dòng: data: JSON.stringify(params), là dự phòng (hoặc phải là). Chỉ cần đặt data: params,

Tiếp theo, trên phương thức web của bạn, bạn chuyển đổi kết quả thành chuỗi JSON và trả về kết quả đó dưới dạng chuỗi. Nếu bạn lớp phương thức web có thuộc tính ScriptMethod, bạn không cần phải làm điều đó. Chỉ cần trả lại dữ liệu dưới dạng kiểu gốc và Asp.Net sẽ thực hiện chuyển đổi sang JSON cho bạn.

Bạn có thể đọc bài viết sau đây: http://elegantcode.com/2009/02/21/javascript-arrays-via-jquery-ajax-to-an-aspnet-webmethod/

http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

+4

Bạn là người đàn ông. Cảm ơn bạn rất nhiều Chris! Tôi đã thêm vào đây: var jsonText = JSON.stringify ({ID: rowid}); sau khi đọc bài viết của bạn. Tôi đã đọc rất nhiều bài báo cho thấy các tham số truyền với dấu ngoặc kép. Của bạn là người đầu tiên tôi đã đọc giải thích và khắc phục nó. Mucho gracias! –

+0

Rất vui được giúp đỡ. –

1

Ngoài việc trên, ta cần kiểm tra để đảm bảo rằng bạn không phải là 'stringifying' mảng JSON nhiều hơn một lần.

Tôi vô tình gọi JSON.stringify() trên một mảng đã được đăng, đã đưa ra một vấn đề tương tự với vấn đề mà OP nhận được.

ví dụ:

var arr = JSON.stringify({ id: elementID, name: Name }); 
.... 
$.ajax({ 
... 
data: JSON.stringify(arr), 
... 
}); 

Trong trường hợp này, thay đổi arr biến khởi tạo để

var arr = { id: elementID, name: Name }; 

giải quyết vấn đề của tôi. :)

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