格式化多结果单个Json值

时间:2015-06-12 20:09:09

标签: javascript jquery json asp.net-mvc razor

我有一个看起来像这样的change / getJson函数:

$('#CountryId').change(function () {
            $.getJSON('@Url.Action("StateList", "Manage")', {id: $('#CountryId').val()}, function (data) {
                var items = '<option value="">Select a State</option>';
                $.each(data.List, function (i, state) {
                    items += "<option value='" + state.Value + "'>" + state.Text + "</option>";
                });
                $('#StateId').html(items);
              //Fail
                //console.log(">>>>" + data.LatLng.Latitude);
                //$('#Latitude').val(data.LatLng.Latitude);
              //Success
                //$.each(data.LatLng, function (i, country) {
                //    $('#Latitude').val(country.Latitude);
                //    console.log(">>>>" + country.Latitude);
                //});
                $('#CityId').html('<option value="">Select a City</option>');
            });
        });

数据从我的json结果中恢复正常。它返回CountryId的Statelist(CountryId是States表中的FK)来构建我的selectlist / dropdownfor control。它还返回CountryId的纬度和经度(来自国家/地区表)。我的选择列表的州列表很好。但是,纬度和经度只会是一组值(即一个记录)。我可以让它在jquery中工作的唯一方法是使用.each循环:

$.each(data.LatLng, function (i, country) {
   $('#Latitude').val(country.Latitude);
   console.log(">>>>" + country.Latitude);
});

我不需要循环,因为它是一组值。是否有另一种更清洁的方式来格式化并避免额外的功能?从上面的代码中可以看出,我已经尝试过了:

console.log(">>>>" + data.LatLng.Latitude);
$('#Latitude').val(data.LatLng.Latitude);

......以及许多其他事情,它总是会回来 undefined 。这是来自控制器的StateList文件:

[HttpGet]
    public ActionResult StateList(int id)
    {
        var list = db.States.Where(d => d.CountryId == id).Select(d => new { Text = d.StateName, Value = d.StateId }).ToList();
        var latlng = db.Countries.Where(d => d.CountryId == id).Select(d => new { d.Latitude, d.Longitude });
        var result = new { List = list, LatLng = latlng };
        return Json(result, JsonRequestBehavior.AllowGet);
    }

我尝试格式化此ActionResult中的latlng数据(即ToListToStringLat = d.Latitude等等),但jquery似乎并不关心因为我把它放在循环中。

我可以在互联网上找到的所有示例都是针对json列表的,这些列表在状态列表部分很有用。但是,我似乎无法找到任何关于单个json值的信息。到目前为止,你似乎必须将价值分解成碎片,以便jquery可以解释它?有人知道消除循环的技巧吗?

1 个答案:

答案 0 :(得分:0)

您的LatLng查询似乎返回一个集合而不是单个项目。因此,您的json结果将是一个数组,强制您迭代也使data.LatLng.Latitude未定义。

您可以调整查询以返回单个项目,而不是使用.Single(), .SingleOrDefault(), .First(), or .FirstOrDefault()返回的集合。

var latlng = db.Countries.Single(d => d.CountryId == id)
               .Select(d => new { d.Latitude, d.Longitude });

然后,您可以移除额外的$.each()循环以访问LatLng属性。