1

WebFormsアプリケーションでAJAXを介してWebサービスを呼び出そうとしています。

私のスクリプトは次のようになります。

$.post('UpdateServer.asmx/ProcessItem',
    'itemId=' + $(this).text(),
    function (result) {
        alert(result);
    });

私のWebサービスは次のようになります。

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
    [WebMethod]
    public string ProcessItem(int itemId)
    {
        return new JavaScriptSerializer().Serialize(
            new { Success = true, Message = "Here I am!" });
    }
}

webメソッドは、期待どおりに、期待される引数を使用して呼び出されます。ただし、success関数($ .post()の最後のパラメーター)に渡される引数はdocument型であり、期待しているSuccessメンバーとMessageメンバーが含まれていません。

期待しているオブジェクトを取り戻すための魔法の言葉は何ですか?

編集

よく調べてみると、探しているデータは次のように見つかります。

result.childNodes [0] .childNodes [0] .data: "{" Success ":true、" Message ":"サーバーが正常に更新されました! "}"

4

3 に答える 3

2

JSON で終わるノードの奇妙な構造が見られるのは、ASMX ScriptServices から JSON を引き出すために必要な方法でサービスを呼び出していないためであり、とにかく JSON 文字列を返します。したがって、最終的な結果として、その JSON 文字列の単一の値を含む XML ドキュメントが返されます。

現在直面している 2 つの具体的な問題は、戻り値を手動で JSON シリアル化していることと、Content-Type でサービスを呼び出していないことですapplication/json(.NET では、応答をシリアル化する JSON に切り替える必要があります)。

これらの問題を修正すると、有効な JSON 文字列ではなく URL エンコードされたデータ パラメータが原因で、「無効な JSON プリミティブ」エラーも発生します。

機能させるには、サーバー側でこれを行います。

[ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
  [WebMethod]
  public object ProcessItem(int itemId)
  {
    return new { Success = true, Message = "Here I am!" };
  }
}

必要に応じて、匿名型と を使用する代わりに、返すデータ転送オブジェクト (別名 ViewModel) を作成することもできますobject

そこから生の JSON を正常に取得するには、クライアント側でこれを行います。

$.ajax({
  url: 'UpdateServer.asmx/ProcessItem',
  type: 'post',
  contentType: 'application/json',
  data: '{"itemId":' + $(this).text() + '}',
  success: function(result) {
    // This will be { d: { Success: true, Message: "Here I am!" } }.
    console.log(result);
  }
});

お時間のある方は、 jQuery for the ASP.NET developerのコミュニケーション セクションの投稿をお読みください。この道を進むにつれて、その情報の多くが役立つことがわかります。

注: helmus が残したリンクは関連性がありました。ASMX ScriptServices を使用して JSON 経由で通信することに関しては、2.0 と現在の間で根本的な変更はありません。.NET でのこの問題に対する真に最先端のアプローチに関心がある場合は、ASP.NET Web API が最適です。

于 2012-04-15T22:46:18.453 に答える
0

この属性を ProcessItem メソッドに追加します。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
于 2012-04-15T21:09:48.070 に答える
0

あなたの$.post電話でより明確にしてください。

$.ajax({
    type:'post',
    url:'UpdateServer.asmx/ProcessItem',
    data: {'itemId':$(this).text()}
}).done(function (result) {
        alert(result);
});
于 2012-04-15T21:10:49.020 に答える