ListItems attributs dans un DropDownList sont perdus sur la publication?
Un collègue m'a montré ceci:
Il a une liste déroulante et un bouton sur une page web. Voici le code behind:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ListItem item = new ListItem("1");
item.Attributes.Add("title", "A");
ListItem item2 = new ListItem("2");
item2.Attributes.Add("title", "B");
DropDownList1.Items.AddRange(new[] {item, item2});
string s = DropDownList1.Items[0].Attributes["title"];
}
}
protected void Button1_Click(object sender, EventArgs e)
{
DropDownList1.Visible = !DropDownList1.Visible;
}
Sur le chargement de la page, les info-bulles sont visibles, mais sur la première publication, les attributs sont perdus. Pourquoi est-ce le cas, et il y a aucune solution de contournement?
- Pobably devez montrer votre .code aspx ainsi.
InformationsquelleAutor David Hodgson | 2009-08-21
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et je voulais contribuer cette de ressources où l'auteur a créé un héritage ListItem Consommation de persister attributs de l'état d'affichage. J'espère qu'il va sauver quelqu'un le temps que j'ai perdu jusqu'à ce que je suis tombé sur elle.
Grâce À Laramie. Juste ce que je cherchais. Il conserve les attributs de la perfection.
À se développer, ci-dessous est un fichier de classe que j'ai créé à l'aide de Laramie du code pour créer un dropdownlist dans VS2008. Créer la classe dans le dossier App_Code. Après la création de la classe, de l'utilisation de cette ligne sur la page aspx inscrire:
Vous pouvez ensuite placer la commande sur votre webform avec cette
Ok, voici la classe...
ddlWhatever.Items
il jette null exception de laddlWhatever
Aucune idée pourquoi?UserControl
et essayez d'hériter de laDropDownList
.La solution la plus Simple est d'ajouter l'info-bulle des attributs dans la
pre-render
événement de la liste déroulante. Toute modification de l'état devrait être fait àpre-render
événement.exemple de code :
Si vous ne voulez charger le listitems sur le premier chargement de la page, puis vous aurez besoin pour permettre à l'état d'affichage de sorte que le contrôle peut sérialiser son état et de le recharger lorsque la page enregistre.
Il y a plusieurs endroits où l'état d'affichage peut être activé: cochez la
<pages/>
nœud dans le web.config et aussi dans le<%@ page %>
directive en haut du fichier aspx lui-même pour leEnableViewState
de la propriété. Ce paramètre devra êtretrue
pour ViewState travail.Si vous ne souhaitez pas utiliser le ViewState, il suffit de retirer le
if (!IsPostBack) { ... }
de partout dans le code qui ajoute leListItems
et les articles seront recréés sur chaque publication.Edit: je m'en excuse - j'ai mal lu votre question. Il est exact que la attributs ne pas survivre à la publication qu'ils ne sont pas numérotés dans l'état d'affichage. Vous devez rajouter de ces attributs sur chaque publication.
Une solution simple Appel de votre déroulant fonction de chargement sur l'événement click où vous demande de publier.
Les solutions à ce problème implique la création de nouveaux contrôles qui ne sont pas tout à fait faisable dans des circonstances normales. Il est un simple et banal solution à ce problème.
Le problème est que le
ListItem
perd ses attributs sur la publication. Toutefois, la Liste elle-même ne perd jamais de toute attributs personnalisés. On peut prendre avantage de cela dans un simple mais efficace ainsi.Suit:
Sérialiser vos attributs en utilisant le code dans la réponse ci-dessus (https://stackoverflow.com/a/3099755/3624833)
De la stocker dans un attribut personnalisé de la ListControl (dropdownlist, checklistbox, peu importe).
Sur publier, lire l'attribut personnalisé à partir de la ListControl et puis désérialiser de retour en tant qu'attributs.
Voici le code que j'ai utilisé pour (de)sérialiser les attributs (Ce que j'avais à faire était de garder une trace de ce que les éléments de la liste ont été à l'origine de rendu sélectionné lorsqu'elles sont récupérées à partir du serveur et ensuite les enregistrer ou supprimer des lignes que par les modifications apportées par l'utilisateur sur l'INTERFACE utilisateur):
(ci-dessus, les "Utilisateurs" est un
CheckboxList
de contrôle).Sur le post de retour (dans mon cas, Soumettre un événement Clic du bouton), j'utilise le code ci-dessous pour récupérer les mêmes et de les stocker dans un Dictionnaire de post-traitement:
(PS: j'ai une bibliothèque funcs que d'effectuer la gestion d'erreur et les conversions de données, en omettant la même chose ici par souci de concision).
Voici l'VB.Net code de la solution proposée par Laramie et affiné par gleapman.
Mise à jour: Le code que j'ai posté ci-dessous est en fait pour le contrôle de zone de liste. Il suffit de changer l'héritage DropDownList et de renommer la classe.
@Sujay
Vous pouvez ajouter un point-virgule séparés du texte dans la liste déroulante la valeur d'attribut (comme csv style), et l'utilisation de la Chaîne.Split(';') pour obtenir 2 "valeurs" de l'un de valeur, comme une solution pour s'en sortir sans avoir à recréer de contrôle de l'utilisateur. Surtout si vous avez seulement quelques attributs supplémentaires, et si elle n'est pas trop long. Vous pouvez également utiliser une valeur JSON dans la liste déroulante la valeur d'attribut et d'analyser ce que vous avez besoin à partir de là.
Solution Simple sans ViewState, la création d'un nouveau serveur de contrôle ou qch complexe:
Création:
Mise à jour:
Exemple:
J'ai réussi à obtenir que l'utilisation des Variables de Session, dans mon cas, ma liste ne va pas contenir de nombreux éléments, de sorte qu'il fonctionne assez bien, c'est la façon dont je l'ai fait:
Lorsque la Page est chargée première fois, la liste est renseignée et j'ai ajouter une Image de l'attribut qui est perdu après la publication 🙁 donc, au moment où j'ai ajouter les éléments avec ses attributs-je créer une variable de Session "attr" ainsi que le numéro de l'élément pris dans le "pour" cycle (ce sera comme attr0, attr1, attr2, etc...) et j'enregistre la valeur de l'attribut (un chemin vers une image dans mon cas), lors de la publication se produit (à l'intérieur du "else") je viens de la boucle de la liste et ajouter l'attribut prises à partir de la variable de Session à l'aide de la "int" de la boucle "for" qui est le même que lorsque la page est chargée (c'est parce que dans cette page, je ne suis pas d'ajouter des éléments à la liste de sélection de sorte qu'ils ont toujours le même index) et les attributs sont mis à nouveau, j'espère que cela aide quelqu'un dans l'avenir, salutations!