使用jQuery Ajax将参数传递给WebMethod

时间:2009-04-09 21:57:13

标签: asp.net jquery web-services json parameters

我有一个简单的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
日期:2009年4月9日星期四,格林尼治标准时间21:43:59 jsonerror:真
缓存控制:私人
内容类型:应用/ JSON;字符集= 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&amp;在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain中的convertedObject)\ r \ n (Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject )\ r \ n在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o,Type type,JavaScriptSerializer)  序列化程序)\ r \ n在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer)  System.Web.Script.Serialization.JavaScriptSerializer中的序列化程序,字符串输入,类型类型,Int32 depthLimit)\ r \ n .Deserialize [T](字符串输入)\ r \ n在System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext上下文,JavaScriptSerializer序列化程序)\ r \ n在System.Web.Script.Services.RestHandler中 System.Web.Script.Services中的.GetRawParams(WebServiceMethodData methodData,HttpContext context)\ r \ n .RestHandler.ExecuteWebServiceCall(HttpContext context,WebServiceMethodData methodData)“,”ExceptionType“ : “System.InvalidOperationException”}

有人对此有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:31)

快速项目:

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

所以这一行: data: JSON.stringify(params),是多余的(或应该是)。 只需设置data: params,

即可

接下来,在您的Web方法上,您将结果转换为JSON字符串并将其作为字符串返回。如果Web方法类具有ScriptMethod属性,则不需要这样做。 只需将数据作为本机类型返回,Asp.Net将为您转换为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/

答案 1 :(得分:1)

除了上述内容之外,还需要检查以确保您没有按字母排序&#39; JSON数组不止一次。

我不小心在已经序列化的数组上调用了JSON.stringify(),这与OP收到的问题类似。

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

在这种情况下,将 arr 变量初始化更改为

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

解决了我的问题。 :)