使用 jQuery Ajax 将参数传递给 WebMethod

Posted

技术标签:

【中文标题】使用 jQuery Ajax 将参数传递给 WebMethod【英文标题】:Passing parameter to WebMethod with jQuery Ajax 【发布时间】:2010-10-18 16:11:44 【问题描述】:

我有一个简单的 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 json错误:真 缓存控制:私有 内容类型:应用程序/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 序列化器, Boolean 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain 处的 throwOnError, Object& convertObject)\r\n (Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object&convertedObject )\r\n 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer 序列化程序)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer .Deserialize[T](字符串输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext 上下文,JavaScriptSerializer 序列化程序)\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"

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

【问题讨论】:

【参考方案1】:

快速项目:

你的变量参数 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/

【讨论】:

你就是男人。非常感谢克里斯!我添加了这个: var jsonText = JSON.stringify( ID: rowid );读完你的文章后。我已经阅读了大量文章,这些文章显示了用引号传递参数。你的是我读过的第一个解释并修复它的。非常感谢!【参考方案2】:

除了上述之外,值得检查以确保您没有对 JSON 数组进行多次“字符串化”。

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

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

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

var arr =  id: elementID, name: Name ;

解决了我的问题。 :)

【讨论】:

以上是关于使用 jQuery Ajax 将参数传递给 WebMethod的主要内容,如果未能解决你的问题,请参考以下文章

如何将附加参数传递给 jQuery DataTable ajax 调用?

使用 jquery ajax 将参数传递给控制器

将多个参数传递给 jQuery ajax 调用

将参数传递给 jQuery 的 select2 ajax 调用

将额外参数传递给jquery ajax promise回调[重复]

Jquery DataTable 将参数传递给ajax 调用asp.net。无效的 JSON 原语