Типичные решения этой проблемы включают создание новых элементов управления, которые не вполне осуществимы в обычных условиях. У этой проблемы есть простое, но тривиальное решение.
Проблема в том, что 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: у меня есть библиотечные функции, которые выполняют обработку ошибок и преобразование данных, опуская то же самое здесь для краткости).
person
Community
schedule
06.01.2015