Très nouveau pour ASP.NET. Nous avons une page qui affiche une liste de choses, mais nous voulons ajouter différentes options pour l'affichage de la liste (comme des vignettes avec des vignettes, comme des listes de textes, etc.). Notre code suit essentiellement ce format:Répéteur ASP avec plusieurs balises <ItemTemplate>
<asp:Repeater runat="server" ID="Repeater">
<ItemTemplate>
// HTML for Thumbnail-tile view
</ItemTemplate>
</asp:Repeater>
Nous avons ajouté des boîtes de radio pour sélectionner la vue de la liste ou la vue de tuiles, mais je dois trouver un moyen de formater les <ItemTemplate>
balises différemment selon que l'on est sélectionné mais je me bats. Ce que j'ai essayé:
- répétiteurs séparés
Cela a été jusqu'à présent le plus de succès, mais il semble comme une solution en désordre, et il faudra un peu refactorisation de code. Je veux m'assurer qu'il n'y a pas de meilleures options avant de m'y engager. Fondamentalement, j'ai deux répéteurs avec leurs champs <ItemTemplate>
respectifs.
<asp:Repeater runat="server" ID="Repeater1>
<ItemTemplate>
// HTML for Thumbnail-tile view
</ItemTemplate>
</asp:Repeater>
<asp:Repeater runat="server" ID="Repeater2>
<ItemTemplate>
// HTML for List view
</ItemTemplate>
</asp:Repeater>
La page appelle ensembles DataSource et appelle DataBind() sur le répéteur par défaut sur la charge de page et un gestionnaire pour chaque bouton radio videra un, et remplir l'autre pour leurs listes respectives. Deux répéteurs semblent être exagérés, et pour que cela fonctionne parfaitement, nous allons devoir refactoriser un peu.
- Placeholders
mise en forme Fondamentalement, le code ainsi:
<asp:Repeater runat="server">
<ItemTemplate>
<asp:PlaceHolder runat="server" ID="???"></asp:Placeholder>
</ItemTemplate>
</asp:Repeater>
Générez le code pour le modèle dans le code sous-jacent en fonction de nos boutons radio, et envoyez simplement cela au client. Élégant. Le seul problème est que l'identifiant de l'espace réservé ne peut pas être un doublon, et dans un répéteur c'est exactement ce que ça va être.
- Masquer celui que nous ne l'utilisons
Fondamentalement, nous avons mis le code pour
<asp:Repeater runat="server">
<ItemTemplate>
<div class="ListView" style="display: block"> // HTML for List view</div>
<div class="TileView" style="display: none">> // HTML for Thumbnail-Tile view </div>
</ItemTemplate>
</asp:Repeater>
Et le gestionnaire d'événements de bouton radio simplement mettre à jour le css sur la div appropriée. Cela a une incidence sur les performances, car nous continuons à charger les vignettes, les URL et d'autres informations pour la liste masquée. Nous voulons éviter tous les frais inutiles pour ce projet, donc cela va être hors de question. Est-ce que j'ai manqué d'autres façons d'aborder ce problème? Comme je l'ai dit, je suis assez nouveau sur ASP.NET, donc je ne suis pas sûr d'avoir considéré toutes les fonctionnalités potentielles. J'ai lu à propos de la propriété ItemTemplateSelector, mais je n'arrive pas à comprendre comment l'utiliser.
Je pense que vous êtes sur la bonne voie. Peut être vous pouvez utiliser le panneau d'asp dans le modèle d'élément. Vous allez définir deux panneaux, un pour la liste et l'autre pour la vue en mosaïque. Et vous pouvez les cacher/les montrer en fonction de la sélection. –
Si j'utilise un panneau, ne dois-je pas lui donner un identifiant pour pouvoir y accéder à partir du code derrière? Si c'est dans un répéteur, aura-t-il le même problème que mon idée d'espace réservé? –
Eh bien, vous pouvez accéder aux panneaux dans le code derrière l'événement databound article –