Типичные решения этой проблемы включают создание новых элементов управления, которые не вполне осуществимы в нормальных условиях. Существует простое, но тривиальное решение этой проблемы.
Проблема в том, что ListItem
теряет свои атрибуты при обратной передаче. Однако сам список никогда не теряет никаких пользовательских атрибутов. Таким образом, можно воспользоваться этим простым, но эффективным способом.
Шаги:
Сериализуйте свои атрибуты, используя код в ответе выше (https://stackoverflow.com/a/3099755/3624833)
Сохраните его в пользовательском атрибуте ListControl (выпадающий список, флажок и т. Д.).
При обратной записи прочитайте пользовательский атрибут из ListControl, а затем десериализируйте его обратно как атрибуты.
Вот код, который я использовал для (де) сериализации атрибутов (мне нужно было следить за тем, какие элементы списка были изначально отображены как выбранные при извлечении из бэкэнда, а затем сохранять или удалять строки в соответствии с изменения, сделанные пользователем в пользовательском интерфейсе):
string[] selections = new string[Users.Items.Count];
for(int i = 0; i < Users.Items.Count; i++)
{
selections[i] = string.Format("{0};{1}", Users.Items[i].Value, Users.Items[i].Selected);
}
Users.Attributes["data-item-previous-states"] = string.Join("|", selections);
(выше, «Пользователи» - это CheckboxList
элемент управления).
При отправке назад (в моем случае событие нажатия кнопки «Отправить») я использую приведенный ниже код, чтобы извлечь его и сохранить в словаре для последующей обработки:
Dictionary<Guid, bool> previousStates = new Dictionary<Guid, bool>();
string[] state = Users.Attributes["data-item-previous-states"].Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);
foreach(string obj in state)
{
string[] kv = obj.Split(new char[] { ';' }, StringSplitOptions.None);
previousStates.Add(kv[0], kv[1]);
}
(PS: у меня есть библиотека funcs, которая выполняет обработку ошибок и преобразование данных, опуская здесь то же самое для краткости).