2017-12-29 26 views
0

EDIT2:解決策を見つけ、問題はAJAX呼び出しのパラメータは、サーバ側のWebMethod属性に送信されていないことになってしまっJSON, AJAX, and ASP.NETJSON文字列化がアレイ上で動作しない(ASP.NET)

参照してください。文字列。 ajax呼び出しのデータフィールドのJSON文字列は、WebMethodのパラメータで指定されたオブジェクトタイプに実際に変換されます。つまり、私の問題は、データが文字列としてWebMethodに渡されず、別のオブジェクト型に渡されていたことでした。

EDIT:Chromeのブラウザコンソールを見ると、次のエラーが表示されます。リソースの読み込みに失敗しました:サーバーがステータス500(内部サーバーエラー)で応答しました。より深いで掘り、私は次の応答があります

{"Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.","StackTrace":" at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList\u0026 convertedList)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"} 

は、以下のAJAX呼び出しが実行されることはありませんが、データパラメータが有効な値を持っていないように思えます。 dataが有効なJSONを持つ文字列リテラルと等しく設定されている場合は問題ありません。 ajax呼び出しでjavascriptオブジェクトをdataの有効なパラメータに変換する際の問題があるようです。

<script type="text/javascript"> 
     $(document).ready((function() { 
      $('#mytable tr').click(function (event) { 
       var array = []; 
       $(".tdval").each(function() { 
        array.push({ 
         value: $(this).html() 
        }); 
       }); 
       alert(JSON.stringify(array)); //produces what appears to be valid json after calling stringify: [{"value":"val1"},{"value":"val2"}] 

       $.ajax({ 
        type: "POST", 
        url: "schedule.aspx/GetCurrentTime", 
        data: JSON.stringify({ array }), //this seems to be the issue 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (response){ 
         alert(response.d + "lol"); 
        }, 
        complete: function() { 
         alert("complete"); 
        } 
       }); 
      }); 
     })); 
    </script> 

そして、これは、AJAX呼び出しの記事その背後にあるC#コード内のメソッドである:私のaspxファイルに以下のコードを参照してください

興味深いことに
[System.Web.Services.WebMethod] 
    public static string GetCurrentTime(string name) 
    { 
     return "Hello "; 
    } 

、私はdata: JSON.stringify({ array })を変更することができますよ文字列リテラルとしていくつかのランダムjsonへのajax呼び出しで、それは正常に動作するはずです。しかし、stringifyを使うと、ajax呼び出しからの "成功"コールバックメソッドは決して実行されません。何かご意見は?

+2

はなぜ二文字列化の呼び出しで中括弧があるのですか?これらは必要ではないと考えています。 – ne1410s

+0

'{array}'は '{array:array}'の略語です。したがって、JSONは配列をJSONオブジェクトの '' array "'プロパティに入れます。それはコントローラーが期待していることですか? – Barmar

答えて

0

あなたがJSON.stringify()を呼び出すときには、オブジェクトの内部配列を持っているので、あなたが送っているJSONは次のようになります。代わりに、以前の関数で警告を受けるものの

{ array: [{"value":"val1"},{"value":"val2"}] } 

代わりに、使用:

data: JSON.stringify(array), 
+0

中括弧を削除してもまだ機能していません。実際にそれらを使用することは意図的ではなく、トラブルシューティングの残骸でした。 JSONLintを使用して、JSONが有効かどうかをテストしました。その他の提案はありますか? –

+0

コンソールの[ネットワーク]タブを見て、AJAX要求が送信されているかどうか、パラメータは何か、コントローラの応答は何ですか? – Barmar

+0

文字列リテラル '{"name": "Bob"}を使用すると、コードが機能します。しかし、JSONLintが有効なJSONを宣言しているにもかかわらず、[{"value": "val1"}、{"value": "val2"}]は機能しません。私は、すべてのコードが利用できるように、このデータが渡されるC#codebehindメソッドを表示するようにコードを更新しました。 –

関連する問題