2017-02-08 4 views
0

Я пытаюсь получить мою строку JSON, прошедшую через ViewBag, в мой нокаут, наблюдаемый и использующий это, чтобы заполнить мультиселективный список. Я не уверен, что я делаю неправильно, но прямо сейчас он принимает каждый отдельный символ в строке JSON и вставляет его в свою собственную строку в списке выбора.получение строки JSON в нокаут наблюдаемый мультиселектор

Вот мой C# код контроллера:

Dictionary<string, string> salesReps = new Dictionary<string, string>(); 
     foreach (var rep in salespeople.Salesperson) 
     { 
      salesReps.Add(rep.Code, rep.Code + " - " + rep.fullName); 
     } 
     //ViewBag.salespeople = salespeople.Salesperson.Select(x => x.Code).Distinct().ToList(); 
     ViewBag.salespeople = JsonConvert.SerializeObject(salesReps); 

А вот код Нокаут:

var cSource = function (data) { 
     var self = this; 

     ..... 
     self.salesPeople = ko.observableArray(); 
}; 

$(document).ready(function() { 

     var modelData = @Html.Raw(Json.Encode(Model)); 

     mySource = new cSource(modelData); 

     //var salesRepList = Html.Raw(Json.Encode(ViewBag.salespeople)); 
     var salesRepList = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.salespeople)); 
     console.log(salesRepList); 

     mySource.salesPeople = salesRepList; 

А вот HTML выберите код:

<select data-bind=" 
options: salesPeople, 
selectedOptions: chosenReps, 
optionsCaption: 'Choose rep(s)' 
"></select> 

И маленький фрагмент того, что выдает мой console.log:

{"USERNAME1":"USERNAME1 - Full Name 1","USERNAME2":"USERNAME2 - Full Name 2","USERNAME3":"USERNAME3 - Full Name 3",..... } 

UPDATE

Я изменил C# код для создания именованных переменных в формате JSON в настоящее время. Вот мой новый выход console.log:

{"username":"BOBC","fullname":"Bob Cottin"},{"username":"JIMT","fullname":"Jim Thorpe"},{"username":"LUKEP","fullname":"Luke Peppin"}, ....} 
+0

Одна вещь, которую я сразу заметил, что вы, кажется, переписав Коммивояжёры наблюдаемым с плоское значение. «mySource.salesPeople = salesRepList», вероятно, должен быть «mySource.salesPeople (salesRepList)» –

ответ

1

Варианты привязки ожидает массив объектов или значений, но в соответствии с вашими лог консоли Коммивояжёры является единым объектом словаря стиль. Возможно, вам придется преобразовать это в массив, чтобы привязка знала, как его разобрать в выбранные параметры.

Если вам нужно только свойство значения и может игнорировать «USERNAME1», «USERNAME2», и т.д., то вы можете использовать цикл, как это, чтобы захватить свойства значение объекта:

for (var x in salesRepList) { 
    if (salesRepList.hasOwnProperty(x)) { 
     mySource.salesPeople.push(salesRepList[x]); 
    } 
} 

Если вы нужны более сложные типы, тогда вам нужно будет создать массив объектов или (за последнее редактирование), чтобы ваш json передал их со стандартными именами параметров. Затем вы можете использовать опции knockout для привязки Text, чтобы указать, какое свойство объекта использовать в качестве отображаемого текста.

Per пример: 3 из knockout docs

<select data-bind="options: availableCountries, 
        optionsText: 'countryName', 
        value: selectedCountry, 
        optionsCaption: 'Choose...'"></select> 

Вот jsFiddle с некоторыми, которые адаптированы к вашему примеру: fiddle

+0

Мне нужны обе части строки JSON. Помогло бы это создать строку JSON с именованными значениями? – dmikester1

+0

Для списка выбора я хочу, чтобы значение было «USERNAME1», а текст «USERNAME1 - полное имя 1». – dmikester1

+0

Я попытался добавить этот цикл вместо 'mySource.salesPeople (salesRepList)', и я продолжаю получать «предупреждение: невосприимчивый скрипт» с возможностью продолжения, отладки или остановки. Я несколько раз ударил, и он продолжает расти. Я предполагаю бесконечный цикл или очень длинный цикл. – dmikester1

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