2

AJAX を使用してデータベースからいくつかの値を取得しようとしていますが、firebug をチェックするたびに、代わりに html コピーが表示されます。

 function foo() {
            $.ajax({
                type: "POST",
                url: "cssAttempt3.aspx/ConvertDataTabletoString",
                data: {},
                dataType: 'json',
                success: function (response) {
                    console.log(result);
                    //I have tried a bunch of things here.
                    //console.log(response, response[0], response[0].value, 
                    //JSON.parse('<%=ConvertDataTabletoString() %>'), JSON.parse(response), JSON.stringify(response), and the list goes on.
                    //Every single time, Firebug shoots back the html document.
                    //Nothing really stands out in this html document.  No errors.
                    //But time to time, Firebug will say unidentified character
                    //JSON.parse: unexpected character
                    //Line 4
                    //Which can't be right, I'm using Google's jQuery and the console.log below is parsed correctly.
                    //If you look up there, result and response are two different things
                    //But Firebug won't report any error even when I compile that.
                    //I've even typed alert("ASDFSAOF") just to see what happens.  Nothing.
                    //I haven't seen "Fail" either.
                },
                failure: function () {
                    console.log("Fail");
                }
            });
        };

        foo();
        console.log(JSON.parse('<%=ConvertDataTabletoString() %>'));
        //This, which has nothing to do with AJAX, works okay.
        //I've taken from the html document 
    </script>

JSONではないと思うので、これを再編集しました。皆さんをそのように導いたことをお詫びします。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.Serialization;
public partial class cssAttempt3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    // This method is used to convert datatable to json string
    [System.Web.Services.WebMethod]
    public static string ConvertDataTabletoString()
    {
        DataTable dt = new DataTable();
        using (SqlConnection con = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=personnet;Integrated Security=Yes;"))
        {
            using (SqlCommand cmd = new SqlCommand(@"SELECT TOP 200 * FROM personnet.dbo.accordionTest", con))
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
                Dictionary<string, object> row;
                foreach (DataRow dr in dt.Rows)
                {
                    row = new Dictionary<string, object>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        row.Add(col.ColumnName, dr[col]);
                    }
                    rows.Add(row);
                }
                return serializer.Serialize(rows);
            }
        }
    }
}
4

3 に答える 3

1

ConvertDataTabletoStringメソッドを[WebMethod]or[ScriptMethod]属性でマークしたことを確認しましたか?

そうしないと、Ajax を介してページを要求すると、通常の HTTP GET 要求を介して要求したかのように処理され、aspx ページが生成する実際の HTML が返されます。もちろん、私は間違っているかもしれませんが、それが起こっているようです。

また、私は通常、aspx ページで Ajax を介して呼び出すメソッドを作成することを好みますstatic。これにより、それらが「通常の」aspx ページの一部ではないことが明確になるためです (機能を混在させておらず、この aspx ページが存在する場合のみ)。 AJAX リクエストをサービスする場合は、おそらく問題ありません)

編集: 言い忘れましたが、firebug に表示されている HTML を注意深く読んでください。実際には、他の何かが完全に間違っていることを示す Web サーバーのエラー メッセージ ページである可能性があります。

于 2013-10-01T12:44:02.323 に答える
1

例とコメントから、JSON が無効である可能性があります。JSONLintで出力を検証できます。で JSON フィードを作成する方法を示していただければ、非常に役に立ちますcssAttempt3.aspx/ConvertDataTabletoString

別の問題は、JSON.parse代わりに を使用していることですJSON.stringify

JSON.parseは、文字列を JSON として解析します。

反対に、JSON.stringifyは JSON 文字列に変換する値を受け入れます。あなたの値 ( response) は既に JSON です。

function foo() {
     $.ajax({
         type: 'POST',
         url: 'cssAttempt3.aspx/ConvertDataTabletoString',
         dataType: 'json',
         contentType: "application/json; charset=utf-8",
         success: function (response) {
             var t = JSON.stringify(response);
             var o = JSON.parse(t); //now this should work. Turns it back into what you get from url response.
             console.log(t);
         },
         failure: function () {
             console.log("Fail");
         },
         error: function (jqXHR,textStatus,errorThrown) {
             console.log(errorThrown); //...its possibly not even JSON response at all!
         }
     });
}

余談ですが、JSON を作成するためのより効率的な方法は、ASHX ハンドラーを使用することです...コードにわずかな変更を加えるだけです。

[DataContract]クラスにとを追加[DataMember]します (System.Runtime.Serializationこれを機能させるには への参照が必要です):

[DataContract]
public class MyDataTableClass
{
    [DataMember]
    private string pro;
    [DataMember]
    private string sn;
    [DataMember]
    private string po;
    //etc

次に、ASHX を作成します (プロジェクトを右クリック -> 新しい項目の追加 -> 汎用ハンドラー)。

public class ConvertDataTabletoString: IHttpHandler
{     
    public void ProcessRequest(HttpContext context)
    {
        List<MyDataTableClass> m = //populate

        MemoryStream stream = new MemoryStream();
        DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(List<MyDataTableClass>));
        s.WriteObject(stream, m);
        stream.Position = 0;
        StreamReader sr = new StreamReader(stream);

        context.Response.ContentType = "application/json";
        context.Response.Write(sr.ReadToEnd());
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

それからあなたのURLを更新してください:url: 'ConvertDataTabletoString.ashx',

于 2013-10-01T13:02:53.520 に答える
0

成功関数では、応答変数を渡します。この変数は、サーバーから取得した応答のストア (値を含む) です。

次のことを試してください:

    function foo() {
    $.ajax({
        type: "POST",
        url: "cssAttempt3.aspx/ConvertDataTabletoString",
        data: {},
        dataType: 'jsonp',
        success: function (response) {

            console.log(response); //change the parse parameter to response
        },
        failure: function () {
            console.log("Fail");
        }
    });
};

編集:

jsonp をデータ型として使用し、出力を解析せずにログに記録してみてください (jsonp が解析してくれます)。

例を更新しました。

編集 2: json.netを使用

using Newtonsoft.Json;
List<Dictionary<string, string>> testDictionary = new List<Dictionary<string, string>()>();
string json = JsonConvert.SerializeObject(testDictionary);

クレジット: C# List<dictionary> To Json

于 2013-10-01T12:43:53.933 に答える