Инициализируйте выпадающий список SELECT2 с помощью OPTGROUP в C # Webform - PullRequest
0 голосов
/ 25 июня 2019

Я искал выше и ниже точный пример того, как заполнить <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 () не способ справиться с этим. Я хочу сохранить код чистым, коротким и быстрым.

Как мне это сделать?

...