2012-05-08 163 views
0

我想從JSON創建一個動態選擇輸入(下拉菜單)。jQuery JSON AJAX返回數據錯誤

我已經嘗試了兩種方法來獲取JSON對象的下拉菜單選擇輸入(我已標記嘗試1和嘗試2在註釋掉JS)。

我有字符串返回到客戶端,但是,前端沒有看到它作爲JSON對象,而只是一個字符串。我試圖使用.Net序列化程序和Json2 Parse解析和序列化它。

AJAX調用

function getcategories(categoryId) { 

    $.ajax({ 
     type: 'POST', 
     url: '/Services/Category.aspx/GetCategory', 
     data: '{"categoryId":"' + categoryId + '"}', 
     contentType: 'application/json; charset=utf-8', 
     global: false, 
     async: false, 
     dataType: 'json', 
     success: function (msg) { 
      if (msg.d == null || msg.d == '') { 
       //end of the road. not more categories. so don't add another DDL 
       jsonList = ''; 
       console.log("No more DDLs: "); 
      } else { 
       //attempt 1: converting returned data to Json 
       //var json = JSON.parse(msg.d);//just returns [object object] 
       //jsonList = json.d; 
       //attemp2: trying to consume stringbuilder string as Json 
       //or if I do the below, I also get an error Table does not exist 
       //jsonList = msg.d 
      } 
     } 

    }); 
    return false; 

} 

返回的JSON

{ 
    "Table": [{ 
     "categoryid": "0", 
     "categoryname": "--Select Category1--" 
    }, { 
     "categoryid": "2", 
     "categoryname": "subname2" 
    }, { 
     "categoryid": "3", 
     "categoryname": "subname3" 
    }, { 
     "categoryid": "4", 
     "categoryname": "subname4" 
    }] 
} 

試圖在一個循環這裏使用:

//simplified function inside the ready() 
//add dynamic select with options from Json 
$('<select id ="DDL' + nextSelect + '" class="cascade"><option value="-">-- Step' + nextSelect + ' --</option></select>').appendTo('div .chooseSteps'); 
console.log("Obj " + categoryJson); //shows the Json string 
console.log("TABLE " + categoryJson.Table); //returns undefined :(
var listItems = ""; 

//Says that Table does not exist (undefined) 
for (var i = 0; i < categoryJson.Table.length; i++) { 
    listItems += "<option value='" + categoryJson.Table[i].categoryid + "'>" + categoryJson.Table[i].categoryname + "</option>"; 
} 

所以我的目標就是要要顯示的選項,並得到Table的值。

我在整個下午搜索了論壇,找不到可行的解決方案,這讓我瘋狂。感謝你的理解。

我使用jQuery 1.7.1 AJAX與Json2.js(如爲舊版瀏覽器備份)與Asp.Net 4.

+0

你有過這種東西與jquery.each javascript對象循環? http://encosia.com/jquery-for-the-asp-net-developer/ –

+0

返回的JSON是真正的JSON還是您所期望的?應該封裝在{「d」:{}} –

+0

@chris vdp msg對象具有d包裝器。裏面的d是上面列出的字符串。我已經通過了這些Encosia頁面和許多關於SA的其他回覆,但還沒有。 – User970008

回答

1

您迴應沒有一個d財產。

不要試圖解析它。 jQuery做到了。

只是這樣做:

jsonList = msg.Table 

雖然我沒有看到你從AJAX調用底部的代碼轉換,所以我不知道是什麼之間發生英寸

這些建議的JSON不會被解析:

console.log("Obj " + categoryJson); //shows the Json string 
console.log("TABLE " + categoryJson.Table); //returns undefined :(

所以,在這裏,你將需要$.parseJSON它。我再次看到兩個代碼示例之間沒有關係。

+0

.net將d中的所有回覆包裝起來。有一種感覺,它不是真正的JSON返回 –

+0

你好,是的msg.d是對象的數據,它不是一個真正的Json返回,除了我添加了[ScriptMethod(ResponseFormat = ResponseFormat.Json)],希望它會做一點事。我收到一個字符串,上面列出的字符串是msg.d的結果 – User970008

+0

@ User970008:如果'msg.d'爲您提供了JSON字符串,那麼'JSON.parse(msg.d);'應該小心你的。它給你'[object object]的事實不應該成爲一個問題。這只是對象的'toString'值。你仍然應該能夠訪問它的屬性。 –

0

那麼,你似乎需要調用:msg.Table而不是msg.d ... msg.d似乎是未定義的。

0

您可以通過

HTML

<select id="fillme"></select>​ 

的JavaScript

var categoryJson = {"Table":[{ "categoryid":"0","categoryname": "--Select Category1--    
"},{"categoryid":"2","categoryname":"subname2"}, 
{"categoryid":"3","categoryname":"subname3"}, 
{"categoryid":"4","categoryname":"subname4"}]}; 

var table = categoryJson.Table; 

$(table).each(function(key,cat){ 
    var option = '<option value="'+cat.categoryid+'">'+cat.categoryname+'</option>'; 
    $('#fillme').append(option); 
}); 

jquery example what this code do

+0

當我嘗試這種方法時,出現「無法識別的表達式」錯誤。我認爲問題是返回的數據是一個扁平的字符串,而不是一個對象。 – User970008