0


コードを単純化して配列を渡すだけにしましたが、コードをステップ実行してajaxリクエストのポイントに到達したときに まだ運がありません

jsonTextに含まれるもの:

[{"UserId":"8"},{"UserId":"9"},{"UserId":"5"},{"UserId":"13"},{"UserId":"6"},{"UserId":"11"}]  

jsonTextSerialized contains:  
"[{\"UserId\":\"8\"},{\"UserId\":\"9\"},{\"UserId\":\"5\"},{\"UserId\":\"13\"},{\"UserId\":\"6\"},{\"UserId\":\"11\"}]"  




function GetUserSchedules() {  
 var jsonText = $.toJSON(arrParams);  
  var jsonTextSerialized = Sys.Serialization.JavaScriptSerializer.serialize(jsonText);  
  $.ajax({  
    type: "POST",  
    url: "/myurl/jquery.aspx/GenerateUserSchedules",  
    data: "{'data':'" + jsonTextSerialized + "'}",  
    contentType: "application/json",  
    dataType: "json",  
    success: function () { alert('Made It!'); },  
    error: function (result) { alert(Failed: ' + result.responseText);   
  });  

背後にある私のコードは

[Serializable]  
public class User  
{  
  public int UserId { get; set; }  
}  

[System.Web.Script.Services.ScriptMethod]  
[System.Web.Services.WebMethod]  
public static void GenerateUserSchedules(User[] data)  
{  
  //do stuff  
} 

responseTextは次のとおり
です。"リクエストの処理中にエラーが発生しました。"、 "StackTrace": ""、 "ExceptionType": ""}

私は何が間違っているのですか?

あなたの助けを借りた私の解決策:

皆様のご尽力に感謝申し上げます。私はあなたのすべての入力にどれほど感謝しているかを表現することはできません。私はそれを認めるのが恥ずかしいです、しかし私はこれに何日も立ち往生していました。

すべての回答から、これに取り組むにはさまざまな方法があることがわかります。私は2つの理由でJSON.stringifyソリューションが一番好きです。

  1. これにより、ajaxリクエストにパラメーターを追加するときに不注意によるタイプミスの危険性がなくなります。
  2. Olegによると、データオブジェクトをシリアル化するためのより効率的な方法です。

それで、これが私が問題を解決することに決めた方法です。

<script type="text/javascript">        
    var startDate;
    var endDate;
    var ddlViewSelectedItem;
    var ddlViewSelectedValue;
    var ddlOrgSelectedValue;
    var arrUsers= [];



    $(document).ready(function () {
        ddlViewSelectedItem = $('#<%=ddlView.ClientID %> option:selected').text();
        ddlViewSelectedValue = $('#<%=ddlView.ClientID %> option:selected').val();
        ddlOrgSelectedValue = $('#<%=ddlOrganization.ClientID %> option:selected').val();

        $.when(GetStartDate(), GetEndDate()) //these populate strt and end dates
            .then(function () {
                GetUserIDs();       // populates arrUsers
                GetUserSchedules();                                    
            })
            .fail(function () {
                failureAlertMsg();

            })
    });

    // Here I use JSON.stringify because it simplifies adding params. No messy single and/or double quote confusion. I love this. Must include json2.js from https://github.com/douglascrockford/JSON-js/blob/master/json2.js
    function GetUserSchedules() { 
        var jsonTextStringified = JSON.stringify({ data: arrParams, startDate: startDate, endDate: endDate, ddlViewSelectedItem: ddlViewSelectedItem, ddlViewSelectedValue: ddlViewSelectedValue, ddlOrgSelectedValue: ddlOrgSelectedValue }); 
        $.ajax({
            type: "POST",
            url: "/myurl/jquery.aspx/GenerateUserSchedules", // this is a call to a pagemethod, not a webservice, so .aspx is correct
            data: jsonTextStringified,
            contentType: "application/json",
            dataType: "json",
            success: function () { alert('Sweet! Made It!'); }
            ,
            error: function (result) { alert('Failed!: ' + result.responseText); }
        });
    }

背後にあるコード:

[Serializable]
public class User
{
    public string UserId { get; set; }
}


[System.Web.Script.Services.ScriptMethod]
[System.Web.Services.WebMethod]
public static void GenerateUserSchedules(User[] data, string startDate, string endDate, string ddlViewSelectedItem, string ddlViewSelectedValue, string ddlOrgSelectedValue)
{
    //do cool stuff and eventually send data back
}

助けてくれてありがとう

4

4 に答える 4

1

それは次のように単純である可能性があります:

data: "{'data':'" + jsonTextSerialized + "'}",

への変更

data: '{"data":"' + jsonTextSerialized + '"}',

および/またはクライアント側"UserId"をに変更する"UserID"

于 2011-03-08T16:48:05.643 に答える
1

これを行うには、いくつかのアプローチがあります。アプリケーションが万が一MSAjaxライブラリを使用している場合、クライアント側で行う必要があるのは

var jsonText = [{"UserId":"8"},{"UserId":"9"},{"UserId":"5"}];
var jsonTextSerialized = Sys.Serialization.JavaScriptSerializer.serialize(jsonText);

次に、このjsonTextSerializedを、サーバー側のコードに送信する必要のある他のパラメーターとともに使用できます。サーバー側では、

public class User{
  public Int32 UserId{
    get;set;
  }
}
[System.Web.Script.Services.ScriptMethod]  
    [System.Web.Services.WebMethod]  
    public static void GenerateUserSchedules(string startDate, string endDate, string ddlViewSelectedItem, string ddlViewSelectedValue, string ddlOrgSelectedValue, User[] customObejct) 

これにより、自動的に実行されます。

MS Ajaxを使用していない場合は、ここからJSON2.jsを入手してください

http://www.json.org/js.html

このライブラリを使用して、クライアント側でオブジェクトをシリアル化できます。サーバー側では、物事は同じままである必要があります。

より詳細なガイドと情報については、これもチェックしてください

http://forums.asp.net/t/1388935.aspx

お役に立てれば!

ニキル

これで、カスタムオブジェクトにオブジェクトが含まれるはずです

于 2011-03-08T16:01:56.247 に答える
1

jsonプロパティの名前とタイプがWebメソッドのパラメーターと一致していることを確認してください。jsonText変数は配列であるため、Webメソッドはそれを受け入れるために配列型のプロパティを必要とします(Nikhilが投稿した例のように)。

したがって、Nikhilの例でWebメソッドシグネチャとカスタムユーザーオブジェクトを使用している場合は、jqueryajax呼び出しのデータプロパティを次のようにする必要があります。

"{'startDate':'" + startDate + "', 'endDate':'" + endDate + "', 'ddlViewSelectedItem':'" + ddlViewSelectedItem + "', 'ddlViewSelectedValue':'" + ddlViewSelectedValue + "', 'ddlOrgSelectedValue':'" + ddlOrgSelectedValue + "','customObejct':" + jsonText + "}"
于 2011-03-08T16:29:11.757 に答える
1

ここここ、またはここで近い答えを見てください。多くの人が同じ間違いをしました。

  1. JavaScriptオブジェクトの初期化では、引用符と二重引用符の両方を使用できますが、JSONデータでは二重引用符のみが許可されます。
  2. {"{'startDate':'" + startDate + "', ...古い$.toJSONjQueryプラグインのようにJSONシリアル化マニュアルを作成したり、使用したりしないでください。最良の方法は、 json2.jsのJSON.stringify関数を使用することです。最新バージョンのWebブラウザーは、ネイティブコードの機能をサポートしているため、非常に高速に動作します。

奇妙に見えるもう1つのことは、「/ myurl / jquery.asmx / GenerateUserSchedules」ではなく「/myurl/jquery.aspx/GenerateUserSchedules」(aspxではなくasmx)のパスです。

あなたの場合、あなたは使用する必要があります

data: JSON.stringify({
    startDate: startDate,
    endDate: endDate,
    ddlViewSelectedItem: ddlViewSelectedItem,
    ddlViewSelectedValue: ddlViewSelectedValue,
    ddlOrgSelectedValue: ddlOrgSelectedValue
})

type: "POST"およびの使用の場合

data: {
    startDate: JSON.stringify(startDate),
    endDate: JSON.stringify(endDate),
    ddlViewSelectedItem: JSON.stringify(ddlViewSelectedItem),
    ddlViewSelectedValue: JSON.stringify(ddlViewSelectedValue),
    ddlOrgSelectedValue: JSON.stringify(ddlOrgSelectedValue)
}

を使用することにした場合type: "GET"

Webメソッドのすべての入力パラメーターのデータを送信することが重要です。少なくとも、null値を入力としてパラメーターを送信する必要があります(null許容オブジェクトの場合)。

更新:質問を書き直したとき。だから今あなたの質問の新しいバージョンの答え。

あなたは使用する必要があります

$.ajax({  
    type: "POST",  
    url: "/myurl/jquery.aspx/GenerateUserSchedules",  
    data: JSON.stringify({data: [
            {UserId:8},{UserId:9},{UserId:5},{UserId:13},{UserId:6},{UserId:11}]}),  
    contentType: "application/json",  
    dataType: "json",  
    success: function () { alert('Made It!'); },  
    error: function (result) { alert(Failed: ' + result.responseText);   
});

理由は簡単です。inputパラメータを持つメソッドがあるため、入力として使用する必要がGenerateUserSchedules(User[] data)あります。オブジェクトの配列は、アイテム(またはまたは)を含む配列である必要がありますが、。ではありません。dataJSON.stringify({data: yourData})User{UserId:8}{'UserId':8}{"UserId":8}{UserId:"8"}

于 2011-03-08T17:00:52.287 に答える