Я искал выше и ниже точный пример того, как заполнить <select>
элемент управления <optgroup>
, но я получаю различные результаты. В документации на select2.org говорится, что формат должен быть таким:
{
"results": [
{
"text": "Group 1",
"children" : [
{
"id": 1,
"text": "Option 1.1"
},
{
"id": 2,
"text": "Option 1.2"
}
]
},
{
"text": "Group 2",
"children" : [
{
"id": 3,
"text": "Option 2.1"
},
{
"id": 4,
"text": "Option 2.2"
}
]
}
],
"pagination": {
"more": true
}
}
Но мои результаты выдают ошибку, утверждающую, что поле 'ID' отсутствует. Я думаю, это связано с тем, как я инициализирую <select>
, но я не вижу другого пути.
Сначала мои данные извлекаются из базы данных MS SQL с помощью хранимой процедуры. У меня нет простого контроля над форматом данных, поэтому я использую Linq для создания объекта, а затем инициализирую <select>
с помощью .DataBind (). Вот соответствующий код:
HTML:
<select id="MySelect" name="myselect" runat="server"></select>
Определения для родителя и ребенка:
public class Parent : Child
{
public List<Child> children { get; set; }
}
public class Child
{
public string id { get; set; }
public string text { get; set; }
}
Оператор Linq:
var parents = myData
.Select(c => new Parent()
{
text = string.Format("{0} {1}", c.first_name, c.last_name),
id = c.ID.ToString(),
children = GetChildren(locations, c)
})
.ToArray();
// Convert to JSON
var json = JsonConvert.SerializeObject(new
{
results = parents
});
Результат Linq, преобразованный в JSON:
{
"results":[
{
"id":"2",
"text":"Parent 1 ",
"children":[
]
},
{
"id":"39",
"text":"Parent 2",
"children":[
{
"text":"Child 2.1",
"id":"62",
"Custom1":"196.00"
},
{
"text":"Child 2.2",
"id":"130",
"Custom1":"642.00"
},
{
"text":"Child 2.2",
"id":"61",
"Custom1":"0.00"
}
]
},
{
"id":"15",
"text":"Parent 3",
"children":[
{
"text":"Child 3.1",
"id":"13",
"Custom1":"40.00"
}
]
}
]
}
DataBind:
MySelect.DataSource = json;
MySelect.DataValueField = "id";
MySelect.DataTextField = "text";
MySelect.DataBind();
После всего этого MySelect <select>
рендерится с выпадающим списком, содержащим только родителей и никаких элементов <optgroup>
в реальном HTML.
Я пытался исключить член 'id' из класса <Parent>
, но затем из-за .DataBind () выдается ошибка, из-за которой нет идентификатора, даже если у всех детей есть идентификаторы.
Я подозреваю, что использование .DataBind () не способ справиться с этим. Я хочу сохранить код чистым, коротким и быстрым.
Как мне это сделать?