我在上下搜索了一个确切的示例,以了解如何用<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创建对象,然后使用.DataBind()初始化<select>
。这是相关代码:
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"
}
]
}
]
}
数据绑定:
MySelect.DataSource = json;
MySelect.DataValueField = "id";
MySelect.DataTextField = "text";
MySelect.DataBind();
所有这些之后,MySelect <select>
的下拉菜单中仅包含父元素,而实际HTML中没有<optgroup>
元素。
我尝试从<Parent>
类中排除'id'成员,但是.DataBind()抛出一个错误,即使子代都有ID,也没有'id'。 / p>
我怀疑使用.DataBind()无法解决此问题。我想保持代码干净,简短和快速。
我该怎么做?