User control pour afficher la description d'un produit

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 343 fois - Téléchargée 34 fois

Contenu du snippet

Dans les sites de commerce, les pages affichant les propriétés d'un produit sont toutes identiques, il y a juste certaines propriétés propre à l'article qui change.

Dans cet exemple, je vais vous montrer, un User Control qui demandera qu'un objet Vin en propriété et ressortira une sorte de fiche complete sur cet objet.

J'ai pris le cas du vin, car je suis en train de developper la nouvelle version de mon site

Ce que je fais est assez simple, j'ai un UserControl (ascx) nommé vin.ascx et j'appelle autant de fois que j'ai d'objet vinClass dans vins.aspx

Source / Exemple :


'Tout d'abord voici le code de la collection de Vins et de la Class VinClass 

#Region " Classes des vins :) "

    Public Class VinClass

        Public Code As String
        Public NomVin As String
        Public Description As String
        Public LongDescription As String
        Public ImageEtiquetteUrl As String
        Public Prix As Decimal

    End Class

    Public Class VinClassCollection
        Inherits CollectionBase

        Default ReadOnly Property item(ByVal index As Integer) As VinClass
            Get
                Return CType(Me.List.Item(index), VinClass)
            End Get
        End Property

        Public Function add(ByVal oVinClass As VinClass) As VinClass
            Me.List.Add(oVinClass)
            Return oVinClass
        End Function

    End Class

#End Region

'Dans Vins.aspx je charge ma collection de Vin, puis je boucle sur cette collection et passe ajoute à ma page un nouvel UserControl avec en parametre l'objet VinClass 

'Voici le code du page_Load de vins.aspx : 

        If Not VinColl.Count = 0 Then

            For Each oVinClass As VinClass In VinColl

                'on charge un nouveau UserControl et on vérifie que celui ci existe
                Dim control As Vin = New Vin
                If New FileInfo(Server.MapPath("vin.ascx")).Exists = True Then
                    control = LoadControl("vin.ascx")

                    'On rentre nos données à l'UserControl
                    control.Vin = oVinClass

                    'On ajoute le usercontrol et une barre horizontale pour séparer les controles
                    Page.Controls.Add(control)
                    Page.Controls.Add(New LiteralControl("<hr/>"))

                    'On lance une exception si le fichier vin.ascx n'existe pas
                Else
                    Throw New Exception("Vin.ascx non trouvé")
                End If

            Next

            Page.Controls.RemoveAt(Vin.Controls.Count - 1)

        End If

'voici maintenant le code de vin.ascx : 

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Vin.ascx.vb" Inherits="BeaujolaisDurand.Vin" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
  <h2><asp:hyperlink id="HyperLinkNomVin" runat="server"/></h2>
    <asp:hyperlink id="HyperLinkImageDetailVin" runat="server"><asp:image id="ImgEtiquette" runat="server"/></asp:hyperlink>
  <dl>
    <dd>Description :</dd> 
    <dt>
		<asp:literal id="LiteralDecriptionVin" runat="server"/>
    </dt>
  </dl>	
  <p class="Tarifs">Tarifs: <asp:literal id="LiteralPrixVin" runat="server"/> €</p>
  <p class="LinkDetailVin"><asp:hyperlink id="HyperLinkDetailVin" runat="server">Cliquer ici pour en savoir plus</asp:hyperlink></p>

'Le code est simple, est il est XHTML compliant, je gere ma mis en page via les CSS2

'Voici le code de vin.ascx.vb
Imports System.IO

Public Class Vin
    Inherits System.Web.UI.UserControl

#Region " Code généré par le Concepteur Web Form "

    'Cet appel est requis par le Concepteur Web Form.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    'REMARQUE : la déclaration d'espace réservé suivante est requise par le Concepteur Web Form.
    'Ne pas supprimer ou déplacer.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
        'Ne le modifiez pas en utilisant l'éditeur de code.
        InitializeComponent()
    End Sub

#End Region

#Region " Protected Withevents "

    Protected WithEvents ImgEtiquette As System.Web.UI.WebControls.Image
    Protected WithEvents LiteralDecriptionVin As System.Web.UI.WebControls.Literal
    Protected WithEvents LiteralPrixVin As System.Web.UI.WebControls.Literal
    Protected WithEvents HyperLinkImageDetailVin As System.Web.UI.WebControls.HyperLink
    Protected WithEvents HyperLinkDetailVin As System.Web.UI.WebControls.HyperLink
    Protected WithEvents HyperLinkNomVin As System.Web.UI.WebControls.HyperLink

#End Region

#Region " Propriété "

    Private _Vin As VinClass
    Public WriteOnly Property Vin() As VinClass
        Set(ByVal Value As VinClass)
            _Vin = Value
        End Set
    End Property

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Placez ici le code utilisateur pour initialiser la page

        If Not _Vin.NomVin Is Nothing Then
            HyperLinkNomVin.Text = _Vin.NomVin

            If Not _Vin.Description Is Nothing Then
                LiteralDecriptionVin.Text = _Vin.Description
            Else
                LiteralDecriptionVin.Text = "Indisponible"
            End If

            'on verra l'existence de la photo
            If Not _Vin.ImageEtiquetteUrl Is Nothing And New FileInfo(Server.MapPath(_Vin.ImageEtiquetteUrl)).Exists = True Then
                ImgEtiquette.ImageUrl = _Vin.ImageEtiquetteUrl
                ImgEtiquette.AlternateText = "Etiquette du " & _Vin.NomVin
            Else
                ImgEtiquette.ImageUrl = "#"
                ImgEtiquette.AlternateText = "Etiquette du " & _Vin.NomVin
            End If

            'on ajoute ou arrondi a 2 chiffres 
            If Not _Vin.Prix = 0 Then
                LiteralPrixVin.Text = FormatNumber(_Vin.Prix, 2)
            Else
                LiteralPrixVin.Text = "Indisponible"
            End If

            If Not _Vin.Code Is Nothing Then
                HyperLinkDetailVin.NavigateUrl = "DetailVin.aspx?vin=" & Server.UrlEncode(_Vin.Code)
                HyperLinkImageDetailVin.NavigateUrl = "DetailVin.aspx?vin=" & Server.UrlEncode(_Vin.Code)
                HyperLinkNomVin.NavigateUrl = "DetailVin.aspx?vin=" & Server.UrlEncode(_Vin.Code)
            Else
                HyperLinkDetailVin.Visible = False
                HyperLinkImageDetailVin.NavigateUrl = "#"
                HyperLinkNomVin.NavigateUrl = "#"
            End If
        Else
            'si il n'y a pas le nom du vin on continue pas plus loin ... 
            Me.Visible = False
        End If
    End Sub

End Class

#Region " Classes des vins :) "

Public Class VinClass

    Public Code As String
    Public NomVin As String
    Public Description As String
    Public LongDescription As String
    Public ImageEtiquetteUrl As String
    Public Prix As Decimal

End Class

Public Class VinClassCollection
    Inherits CollectionBase

    Default ReadOnly Property item(ByVal index As Integer) As VinClass
        Get
            Return CType(Me.List.Item(index), VinClass)
        End Get
    End Property

    Public Function add(ByVal oVinClass As VinClass) As VinClass
        Me.List.Add(oVinClass)
        Return oVinClass
    End Function

End Class

#End Region

Conclusion :


J'espere avoir été assez clair, si vous avez des question n'hésitez pas :)

Pour resumer, prenons cette fois cet exemple avec des Produits.

Je definit une classe Produit et aussi une classe de Collection de produit. Jusque la pas de problème

Ensuite dans ue de mes pages, je met tout les produits que je veux afficher dans la collection de produit.
Je boucle sur Chaque produit et j'instancie un nouveau UserControl avec en parametre ce produit :
For Each oVinClass As VinClass In VinColl

'on charge un nouveau UserControl et on vérifie que celui ci existe
Dim control As Vin = New Vin
control = LoadControl("vin.ascx")
control.Vin = oVinClass

'On ajoute le usercontrol et une barre horizontale pour séparer les controles
Page.Controls.Add(control)

Next

et dans le ascx on a une propriété de type produit, et cette propriété contient toutes les informations sur le produit, libre a nous de mettre les informations qui nous interesse sur la page

La capture d'ecran vous montre ce que ca donne au final

Maintenant si je veux rajouter un vin à la page, j'ai juste à rajouter un noeud à mon fichier xml et le reste se fait automatiquement (car j'ai décidé de peupler ma collection de vin via un fichier xml, mais ca revient au meme avec une bdd)

A voir également

Ajouter un commentaire

Commentaires

cs_fabrice69
Messages postés
1766
Date d'inscription
jeudi 12 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
4 -
Juste une petite précision. Ce n'est pas un Custom WEB Control mais un User Control.
Il y a de nombreuses différences entre ces deux types de controle utilisateur.

Regardez le site suivant pour voir les différences :
- http://msdn.microsoft.com/library/fre/default.asp?url=/library/fre/vbcon/html/vbconwebusercontrolsvscustomwebcontrols.asp

Sinon c'est pas mal.

F___
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
16 -
Merci, j'ai corrigé cet etourderie
theaidan2
Messages postés
2
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
10 juin 2007
-
Bonjour Cyril,
J'ai trouvé votre source très interressante, mais malheureusement, j'ai un pb avec les loadcontrol.

J'utilise en ce moment un ascx qui instancie dans un place holder d'autres ascx en fonction du contenu à afficher. les ascx qui sont dans le placeHolder peuvent notifier l'ascx racine que la vue a changé pour que l'ascx racine vide le placeholder et affiche dedant les nouvelles information (donc des nouveaux ascx). l'idée est de piloter une navigation maitre/détail à plusieurs niveaux dans un seul ascx, l'affichage du détail replace alors celle du maitre. le probleme est le suivant : si je met les lodcontrol("MyUserControl.ascx") trop tôt (Init), la vue ne change pas à l'évenement déclanché par l'ascx enfant, si je le met trop tard (preRender), l'évenement n'est pas déclanché du tout.
Auriez vous une idée sur la question ?
D'avance Merci.
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
16 -
je te conseille de lire cet article : http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx
qui t'expliquera tout comment bien faire pour ajouter des controles dynamiquement.
theaidan2
Messages postés
2
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
10 juin 2007
-
Merci pour votre réponse.
Je vais lire cela avec attention.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.