0

次のような ashx ハンドラーへの Json 呼び出しを行います。

    attributes = $("#pageHtmlTag").attr("class").trim();
urlToHandler = 'JSonTestHandler.ashx';
jsonData = '{' + attributes + '}';

$.ajax({
    url: urlToHandler,
    data: jsonData,
    dataType: 'json',
    type: 'POST',
    contentType: 'application/json',
    success: function (data) {
        setAutocompleteData(data.responseDateTime);
        $("body").add("<div>" + data.toString() + " </div>").appendTo(document.body);
        alert("grate suceees");
    },
    error: function (data, status, jqXHR) {
        alert('There was an error.' + jqXHR);
    }
}); // end $.ajax   

受け取って処理します。また、表示する HTML を送り返したいのですが、HTML を Jscript に送り返す方法がわかりません。

灰:

    string jsonData = new StreamReader(context.Request.InputStream, System.Text.Encoding.UTF8).ReadToEnd();

.............................

        var testResultReportString = testResultReport.GetReportHtml();

        var serializer = new JavaScriptSerializer();
        var jSonTestResultReport = serializer.Serialize(testResultReportString);

        context.Response.Write(jSonTestResultReport);

そこで質問です。Ajax 呼び出し成功関数にデータを返すにはどうすればよいですか?

4

3 に答える 3

0

$.ajaxAJAX 呼び出しによって返されたデータを返すことはできません。非同期であるため、呼び出しの直後にはデータを使用できないためです。返せるのは、AJAX 呼び出しによって返されるデータの約束です。promise は、関数が言うのに適した抽象化です: データをまだ持っていないのでデータを返すことができず、ブロックして待たせたくないので、代わりに promise を使用すると、データを返すことができます。後で使用するか、他の人に渡して処理を完了するだけです ( Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patterns in JavaScript )。たとえば、次の代わりに:

$.ajax({
     url: urlToHandler,
     data: jsonData,
     dataType: 'json',
     type: 'POST',
     contentType: 'application/json',
     success: function (data) {
         setAutocompleteData(data.responseDateTime);
         $("body").add("<div>" + data.toString() + " </div>").appendTo(document.body);
         alert("great success");
     },
     error: function (data, status, jqXHR) {
         alert('There was an error.' + jqXHR);
     }
 }); // end $.ajax  

$.ajax(...)次のような Ajax 関数を記述して、呼び出しの戻り値を返すことができます。

function testResultReportAjax() {
    return $.ajax({
        url: urlToHandler,
        data: jsonData,
        dataType: 'json',
        type: 'POST',
        contentType: 'application/json',
        error: function (data, status, jqXHR) {
            alert('There was an error.' + jqXHR);
        }
    });
}

あなたはあなたの約束を次の方法で得ます

var promise = testResultReportAjax();

これを関数呼び出しで引数として使用し、AJAX 呼び出しによって返されるデータを使用できます。

promise.success(function (data) {
   alert(data);
});

ここで簡単なデモを見ることができます。必要に応じて、より良い説明については、この回答を参照してください。

于 2012-09-26T10:02:25.730 に答える
0

データを JSON オブジェクトとして返すことができます。

var outputObject = "{ html = '" + jSonTestResultReport  + "' + someOtherData = ... + "}";
context.Response.Write(outputObject);

次のような成功関数でそれらにアクセスします。

data.html and data.someOtherData
于 2012-09-26T09:40:04.903 に答える
0

アプリケーションでは、このように使用しています。下にあるのは、国IDを持つすべての州データと、そのデータがこのように州ドロップダウンリストにバインドされていることを示しています..

StateData objStateData = new StateData();
            LMGDAL.db_LMGEntities dbData = new db_LMGEntities();               
            var data = (from con in dbData.tblStates
                        where con.State_CountryID == ID
                        select new StateData
                        {
                            StateID = con.StateID,
                            StateName = con.StateName
                        }).ToList();
            return data.ToArray(); 

また、その .ashx ファイル内に新しいクラスを作成します

[Serializable]
    public class StateData
    {
        public int StateID { get; set; }
        public string StateName { get; set; }
    }

そして私の形で

$("#ddlCountry").change(function () {
            var countryID = $("#ddlCountry").val();
            $.ajax({
                type: "POST",
                url: "JsonData.asmx/GetStateByCountryID",
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                data: '{ID:"' + countryID + '"}',
                success: function (msg) {
                    var data = msg.d;
                    var stateData = "";
                    $.each(data, function (index, itemdata) {
                        stateData += "<option  value='" + itemdata.StateID + "' > " + itemdata.StateName + " </option>";
                    });
                    $("#ddlState").empty();
                    $("#ddlState").append("<option value='0'>-Select State-</option>");

                    $("#ddlState").append(stateData);
                },
                error: function () {
                    alert('Faild To Retrieve States.');
                }
            });
        });

私はこれがあなたを助けると思う.....

于 2012-09-26T09:49:11.950 に答える