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)
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.