我有一个看起来像这样的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
数据(即ToList
,ToString
,Lat = d.Latitude
等等),但jquery似乎并不关心因为我把它放在循环中。
我可以在互联网上找到的所有示例都是针对json列表的,这些列表在状态列表部分很有用。但是,我似乎无法找到任何关于单个json值的信息。到目前为止,你似乎必须将价值分解成碎片,以便jquery可以解释它?有人知道消除循环的技巧吗?
答案 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
属性。