User control pour afficher la description d'un produit

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

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.