Вам не нужно составлять свой Json вручную, есть другие способы сделать это.
Сначала начните с изменения вашего QuestionList
объекта, чтобы оно имело другое поле с именем Answer
или как вы предпочитаете его вызывать.
public class QuestionList
{
public string QuestionLabel { get; set; }
public string QuestionCode { get; set; }
public string Answer { get; set; }
}
Это новое свойство будет содержать значение ответа.
Второе: измените List<QuestionList>
для коллекции ObservableCollection
Здесь:
private ObservableCollection<QuestionList> survey;
и здесь
survey = new ObservableCollection<QuestionList>
{
new QuestionList { QuestionLabel = "Question 1?", QuestionCode = "01" },
new QuestionList { QuestionLabel = "Question 2?", QuestionCode = "02" }
};
Немного измени свой XAML. Привязка Answer
к Picker
SelectedItem
. Вот где происходит «Магия».
<Picker x:Name="QuestionPicker"
SelectedItem="{Binding Answer, Mode=TwoWay}">
<Picker.Items>
<x:String>Yes</x:String>
<x:String>No</x:String>
</Picker.Items>
</Picker>
Каждый раз, когда пользователь выбирает значение из Picker
, оно автоматически обновляет свойство Answer
списка, который вы задали как ItemsSource
. Подробнее о привязках здесь
Теперь вы просто измените событие нажатия кнопки, и с этой строкой кода у вас будет хорошо сделанный Json. (Сначала вам нужно установить Newtonsoft Nugget )
Здесь учебник, показывающий, как установить пакет слепков (по совпадению они используют эту же библиотеку в качестве примера, повезло нам!).
var json = JsonConvert.SerializeObject(survey);
Выше будет создан JSON со следующим форматом:
[
{
"QuestionLabel":"Question 1",
"QuestionCode" : "01",
"Answer":"No"
},
{
"QuestionLabel":"Question 2",
"QuestionCode" : "02",
"Answer":"Yes"
},
{
"QuestionLabel":"Question 3",
"QuestionCode" : "03",
"Answer":"Yes"
},
{
"QuestionLabel":"Question 4",
"QuestionCode" : "04",
"Answer":"Yes"
},
{
"QuestionLabel":"Question 5",
"QuestionCode" : "05",
"Answer":"No"
}
]
Как вы можете видеть, это представляет Массив QuestionList, и ваша конечная точка сервера должна ожидать это как тело запроса. Я заполнил Answer
случайными значениями для ясности.
и весь код события Click будет выглядеть как
void Button_Clicked(object sender, System.EventArgs e)
{
using(var client = new HttpClient())
{
client.BaseAddress = new Uri("http://myip");
var json = JsonConvert.SerializeObject(survey);
var listViewDataContent = new FormUrlEncodedContent(json);
var response = client.PostAsync("/api/GetData", listViewDataContent);
}
}
Примечание. Обратите внимание, что я немного изменил способ инициализации HttpClient. Да, я знаю, этот документ существует, но вы все равно создаете новый экземпляр при каждом нажатии кнопки, и поскольку это не является частью вопроса, чтобы сказать, что мы его не видели.
Примечание 2: сопоставьте значения с тем, что сервер ожидает в json. Здесь важно было показать вам, что с помощью Xamarin.Forms Binding вы можете получить значения из ListView
, а также с помощью Newtownsoft.Json вы можете легко конвертировать ваши данные из a C # Объект для Json . Подробнее об этой библиотеке здесь .
Надеюсь, это поможет .-