0

私はこのコードを持っています:

var mapcity = new Array([]);              

         $.ajax({
             type: 'GET',
             url: '/home/DrawMap',
             dataType: 'json',
             success: function (data) {

                 var len = data.length;

                 for (var i = 0; i < len; i++) {

                    // mapcity['' + data[i].name + ''] = { center: new google.maps.LatLng(data[i].x, data[i].y), population: data[i].population, name: '' + data[i].name + '' };
                     mapcity['' + data[i].name + ''] = { center: new google.maps.LatLng(data[i].x, data[i].y), population: data[i].population, name: ''+data[i].name+'' };
                     //newarr[i] = data[i].name;

                   alert(mapcity[0].population)
                 }
                 }
         });
}

これは私のコードの一部であり、これは controller の関数です:

public ActionResult DrawMap() {   

  string data = "[{ 'x':31.949454,'y': 35.932913,'population':50000,'name':'amman'},{ 'x':33.79,'y': 33.39,'population':100000,'name':'Zarqa'}]";
        data=data.Replace("'","\"");
        return this.Content(data, "application/json");       

    }

これを実行すると、コントローラーからの JSON データが返されますが、mapcity 変数には保存されません。そして、それは何もしません。どうすればそれを解決できますか?何が間違っていますか?

4

2 に答える 2

7

手動で JSON を構築することは決してすべきではありませんが、常に JSON シリアライザーを使用してください。

public ActionResult DrawMap() 
{
    var data = new[]
    {
        new
        {
            x = 31.949454,
            y = 35.932913,
            population = 50000,
            name = "amman",
        },
        new
        {
            x = 33.79,
            y = 33.39,
            population = 100000,
            name = "Zarqa",
        }
    };

    return Json(data, JsonRequestBehavior.AllowGet);
}

また、成功ハンドラーの外で変数を宣言しました。mapcityこれは、AJAX 自体の性質が非同期であるため、明らかに不可能な $.ajax 呼び出しの直後にその値を使用しようとしていると考えさせられます。これは、成功のコールバックがかなり後で実行され、$.ajax 呼び出しがすぐに返されることを意味します。

したがって、この変数を使用する唯一の安全な場所は、 success関数の内側です。

$.ajax({
    type: 'GET',
    url: '/home/DrawMap',
    success: function (data) {
        var mapcity = {};
        var len = data.length;
        for (var i = 0; i < len; i++) {
            mapcity['' + data[i].name + ''] = { center: new google.maps.LatLng(data[i].x, data[i].y), population: data[i].population, name: ''+data[i].name+'' };
        }
    }
});

また、別の問題があります。mapcity変数を配列 ( ) として宣言しnew Array([])、次に整数以外のインデックスを挿入しようとしました:

mapcity['' + data[i].name + '']

配列を宣言するときのJavaScriptでは、0ベースの整数インデックスのみを持つことができます。したがって、それを javascript オブジェクト var として宣言するか、mapcity = {};整数インデックスのみを使用することができます。

于 2013-09-12T16:11:45.097 に答える