Typische Lösungen für dieses Problem sind das Erstellen neuer Steuerelemente, die unter normalen Umständen nicht ganz realisierbar sind. Es gibt eine einfache, aber triviale Lösung für dieses Problem.
Das Problem ist, dass der ListItem
seine Attribute beim Postback verliert. Die Liste selbst verliert jedoch niemals benutzerdefinierte Attribute. Man kann dies also auf einfache und doch effektive Weise nutzen.
Schritte:
Serialisieren Sie Ihre Attribute mit dem Code in der obigen Antwort ( https://stackoverflow.com/a/3099755/3624833 ).
Speichern Sie es in einem benutzerdefinierten Attribut des ListControl (Dropdown-Liste, Checkliste, was auch immer).
Lesen Sie beim Zurücksenden das benutzerdefinierte Attribut aus dem ListControl zurück und deserialisieren Sie es dann wieder als Attribute.
Hier ist der Code, mit dem ich Attribute (de) serialisiert habe (Was ich tun musste, war zu verfolgen, welche Elemente der Liste ursprünglich als ausgewählt gerendert wurden, als sie aus dem Backend abgerufen wurden, und dann Zeilen gemäß den von vorgenommenen Änderungen zu speichern oder zu löschen der Benutzer auf der Benutzeroberfläche):
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);
(oben ist "Benutzer" ein CheckboxList
Steuerelement).
Beim Zurücksenden (in meinem Fall ein Ereignis zum Senden der Schaltfläche "Klicken") verwende ich den folgenden Code, um dasselbe abzurufen und zur Nachbearbeitung in einem Wörterbuch zu speichern:
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: Ich habe eine Bibliotheksfunktion, die Fehlerbehandlung und Datenkonvertierung durchführt und diese hier der Kürze halber weglässt.)