2015-06-12 2 views
1

У меня есть изменение/функцию getJson которая выглядит следующим образом:Формат многопрофильным результата одно значение Json

$('#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 штраф. Он возвращает statelist для этой CountryId (CountryId является FK из таблицы States), чтобы построить мой selectlist/dropdown для управления. Он также возвращает значение Широта и долгота для 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); 

... и многого другой, и он всегда возвращается неопределенных. Вот мой 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); 
    } 

Я пытался форматировать данные latlng в этом ActionResult (т.е. ToList, ToString, Lat = d.Latitude, и т.д. и т.п.), но JQuery, кажется, не волнует до тех пор, как я положил он в цикле.

Все примеры, которые я могу найти в Интернете, предназначены для списков json, которые отлично работали в разделе списка состояний. Но, похоже, я не могу найти ничего относительно единственной ценности json. И, похоже, до сих пор, вам нужно разбить значение на части, чтобы jquery мог интерпретировать его? Кто-нибудь знает трюк, чтобы исключить цикл?

+3

Дамп для консолидации результата json и проверки 'LatLng'. Это, вероятно, массив, поэтому отредактируйте свой запрос, добавив '.Single()' или '.First()'. – Jasen

+1

Try: 'console.log (data.LatLng [0] .Latitude);' – Hackerman

+0

Спасибо, ребята, я не уверен, что 'data.LatLng [0] .Latitude' был скорее шагом устранения неполадок, но оба эти на самом деле работают на то, что я пытаюсь сделать. Я думаю, что искал '.Single()', поскольку он кажется немного более чистым/элегантным. Если бы это был «ToSingle()», я мог бы сам это понять. Меня поражает, что я не могу найти этот материал в google, в том числе о том, как сбрасывать все на консоль. В любом случае ... @Jasen Если вы хотите это написать, я дам вам кредит как ответ. Благодарю. – SumNone

ответ

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 свойств.

+0

Интересно, что VS бросает ошибку, когда я помещаю 'Single' вверх после' db.Countries' вроде этого. Ему не нравится «Выбрать» (нет метода определения или расширения для выбора). Однако, если я делаю это так: 'var latlng = db.Countries.Where (d => d.CountryId == id). Выберите (d => new {d.Latitude, d.Longitude}). Single() ; '... все работает так, как ожидалось. – SumNone

Смежные вопросы