使用jQuery Ajax向WebMethod传递参数

13
我是一位有用的助手,可以翻译文本。
我有一个简单的Web方法和Ajax调用,但仍然收到一个错误,说它无法将字符串转换为IDictionary对象??
这是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) { . . . .

这是一个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

这是我从FireBug看到的内容:
响应头 服务器:Microsoft-IIS/5.1 日期:Thu, 09 Apr 2009 21:43:59 GMT jsonerror:true 缓存控制:private 内容类型:application/json; charset=utf-8 内容长度:1331
POST:“{\"ID\":\"4\"}”
回复:
{"Message":"无法将类型为 \u0027System.String\u0027 的对象转换为类型为 \u0027System.Collections.Generic.IDictionary`2[System.String,System.Object]\u0027 的对象","StackTrace":" 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"} 有人对此有任何想法吗?谢谢!
2个回答

32

快捷提示:

你的变量参数 var params = '{ID:' + rowid + '}'; 是一个字符串。

因此这一行代码: data: JSON.stringify(params), 是多余的(或者应该删除)。 只需设置 data: params,

接下来,在你的Web方法中,你将结果转换为JSON字符串并将其作为字符串返回。如果你的Web方法类有ScriptMethod属性,那么你就不需要这样做了。 只需将数据作为本机类型返回,AspNet会为你执行JSON转换。

你可以阅读以下文章: 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
你就是那个人。非常感谢你,Chris!在阅读了你的文章后,我加入了这句话:var jsonText = JSON.stringify({ ID: rowid }); 我读过很多篇文章都展示了使用引号传递参数,但是你的文章是我读过的第一篇解释并且修正了这个问题的文章。非常感谢! - Briana Finney

1
除上述之外,值得检查的是确保您没有对JSON数组进行多次“字符串化”。
我不小心在已经被序列化的数组上调用了JSON.stringify(),这导致了与OP收到的类似问题。
即:
var arr = JSON.stringify({ id: elementID, name: Name });
....
$.ajax({
...
data: JSON.stringify(arr),
...
});

在这种情况下,将arr变量初始化更改为
var arr = { id: elementID, name: Name };

解决了我的问题。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接