2011-11-15 63 views
3

我有一個MVC 3 jsonresult控制器,它返回一個包含與特定國家相關的地區,下面的代碼JSON字符串:

public JsonResult getRegions(int countryID) 
    { 
     var regions = from r in db.Regions where r.CountryID == countryID select r; 

     var builder = new StringBuilder(); 
     builder.Append("["); 
     foreach (Region region in regions) 
      //builder.AppendFormat("{0}, \"{1}\"", "RegionID: " + region.RegionID, "RegionName: " + region.RegionName);     
      builder.Append("{ RegionID: " + region.RegionID + ", RegionName: " + region.RegionName + "},"); 
     //var result = builder.ToString().TrimEnd(new char[] { ',', ' ' }) + "]";    
     builder = builder.Append("]"); 

     var result = builder.Replace(",]", "]"); 

     return Json(result.ToString(), JsonRequestBehavior.AllowGet); 
    } 

這將返回一個JSON格式化字符串,讓我們假設國家選擇的是肯尼亞,輸出字符串如下所示:

[{ RegionID: 1, RegionName: Nairobi Region},{ RegionID: 3, RegionName: Coast Region}] 

我有一個JavaScript是通過爲國家的ID控制器,以獲得區域,這是我最終想要使用填充新的下拉列表。我的JavaScript看起來如下:

$(document).ready(function() { 
$("#CountryID").change(function() { 
    $.ajax({ 
     type: "GET", 
     url: "/ajaxcalls/getregions", 
     data: "countryID=" + $("#CountryID :selected").val(), 
     datatype: "json", 
     success: function (result) { 
      var options = ("#regions"); 
      $.each(result, function (item) { 
       alert(item.RegionID + " " + item.RegionName); 
      }); 
     }, 
     error: function (req, status, error) { 
      alert(error + " " + req); 
     } 
    }); 
}); 
    }); 

但彈出的警告說:

不確定不確定。

+0

請提供關於從服務器的響應,不確定的不確定可能會顯示您正在試圖將對象轉換成字符串的更多信息。 –

+0

我只注意到了來自altert消息的未定義,這不是我不相信的服務器響應。 –

回答

0

使用result.d並獲取實際數據。螢火蟲說什麼?

您也可能想要閱讀this

+0

我最終只是改變了控制器的輸出使用.ToList()和mvc似乎已經序列化了我。感謝所有的迴應傢伙。 –

3

我強烈建議使用JSON序列化程序來構建一個JSON字符串,如JavaScriptSerializer,Json.NET's SerializerDataContractJsonSerializer。這將使創建JSON的過程更容易出錯,併爲您節省手動滾動的工作:)

看起來好像您構建的JSON無效JSON:每個鍵都應該用雙引號,應該像每個字符串值一樣。

此外,傳遞給$.each的函數有兩個參數,指標和價值,所以$.each通話success函數內應

$.each(result, function (index, item) { 
    alert(item.RegionID + " " + item.RegionName); 
}); 
+0

你能否詳細闡述一下客戶端的東西?我認爲他不是使用data.d提取數據部分。願意對你的評論:) – Rohan

+1

@Rohan - 在MVC中,響應不會包裝在'd'對象中,因爲它在ASP.NET Web服務和頁面方法中。由於OP使用jQuery,並且數據類型設置爲'json',因此jQuery會將響應(在檢查它是否爲「安全」json之後)解析爲JavaScript數據結構,然後使用該數據結構。 –

+0

我真的不想使用別人的序列化程序,因爲那樣我就永遠無法確切知道如何創建我自己的json字符串。但似乎這將是我必須走的道路。 –

0

也許你可以使用這樣的事情

jQuery.getJSON(url, null, function (countryString) { 
     //countryString es the data returned from de action method. 
    }); 
0

修改你的錯誤看起來像這樣

error: function(XMLHttpRequest, textStatus, errorThrown){ 
alert(errorThrown); 
} 

並使用IISExpress - 在VS中構建Web服務器時不會生成這些屬性。

好運