Comment faire pour conserver une Liste<T> propriété dans ASP.NET Contrôle Personnalisé?
J'ai la propriété suivante dans un contrôle personnalisé:
List<myClass> _items;
public List<myClass> Items{
get { return _items; }
set { _items= value; }
}
Dans mon code, j'ai ajouter des éléments à la collection comme dans...
myCustomControl.items.Add(new myClass());
Cependant, ce ne sont pas persisté à travers les publications. Quelle est la bonne manière de permettre la persistance dans les contrôles personnalisés?
Vous devez vous connecter pour publier un commentaire.
Aïe! Ne pas mettre une Liste<> dans le ViewState! Ça va être énorme!
Si vous ajoutez une Liste<string> qui contient deux éléments - "abc" et "xyz" dans le ViewState, il va pousser de 312 octets.
En revanche, si vous ajoutez un string[] qui contient les deux mêmes éléments, il ne fera que croître de 24 octets.
Et que c'est juste des listes de chaînes! Vous pouvez mettre vos classes là que Corey Downie suggère, mais le ViewState vont se multiplier!
Pour garder une taille raisonnable, vous devrez aller pour un peu d'effort pour convertir votre liste d'éléments dans des tableaux de chaînes et de retour à nouveau.
Comme une alternative, envisager de mettre vos objets dans la Session: de cette façon, vos objets seront stockés sur le serveur, au lieu d'être sérialisé dans le ViewState et envoyé au navigateur et à l'arrière.
Une façon de surmonter le problème de taille avec une liste générique est de persister dans l'état d'affichage de base de type tableau:
si vous parlez de la persistance des données à travers les publications de la même page, puis vous pouvez ajouter manuellement les articles à l'état d'affichage et de le récupérer Sur la Charge.
Vous pouvez les stocker dans le contrôle de viewstate
Je suis d'accord qu'il y a des problèmes avec une Liste<> dans le viewstate mais il fonctionne. Notez qu'il n'y a pas de setter sur cette de par leur conception. Vous avez besoin d'une référence à l'objet de la liste d'objet et votre méthode d'obtenir les nouvelles de la liste en cas de besoin.