web-dev-qa-db-ja.com

jQueryAjaxを使用してWebMethodにパラメーターを渡す

単純な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 GMT
jsonerror:true
Cache-Control:private
Content-Type:application/json; charset = utf-8
Content-Length:1331

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

応答:

{"メッセージ": "システムでタイプ\ u0027System.String\u0027のオブジェクトをタイプ\ u0027System.Collections .Generic.IDictionary`2 [System.String、System.Object]\u0027"、 "StackTrace": "に変換できません。 Web.Script.Serialization .ObjectConverter.ConvertObjectToTypeInternal(Object o、Type type、JavaScriptSerializer serializer、Boolean throwOnError、Object&convertedObject)\ r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o、Type type、JavaScriptSerializer serializer 、Boolean throwOnError、Object&convertedObject)\ r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o、Type type、JavaScriptSerializer serializer)\ r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize( JavaScriptSerializerシリアライザー、文字列入力、タイプタイプ、Int32depthLimit)\ r\n(System.Web.Script.Serialization.JavaScriptSerializer .Deserialize [T](文字列入力)\ r\n、System.Web.Script.Services.RestHandler)。 GetRawParamsFromPostRequest(HttpContextコンテキスト、 JavaScriptSerializerシリアライザー)\ r\nSystem.Web.Script.Services.RestHandler .GetRawParams(WebServiceMethodData methodData、HttpContext context)\ r\n System.Web.Script.Services .RestHandler.ExecuteWebServiceCall(HttpContext context、WebServiceMethodData methodData) " 、 "ExceptionType": "System.InvalidOperationException"}

誰かがこれについて何か考えがありますか?ありがとう!

13
Briana Finney

クイックアイテム:

変数params _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/

32
Chris Brandsma

上記に加えて、JSON配列を複数回「文字列化」していないことを確認する価値があります。

すでにシリアル化されている配列で誤ってJSON.stringify()を呼び出したため、OPが受け取ったものと同様の問題が発生しました。

つまり.

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

この例では、arr変数の初期化を次のように変更します。

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

私の問題を解決しました。 :)

1
XtraSimplicity