Gestionnaire de plugin ascx

0/5 (4 avis)

Vue 11 551 fois - Téléchargée 363 fois

Description

Un exemple simple pour gérer dynamiquement des modules (usercontrol) à afficher dans vos pages.
J'utilise ce code pour des modules d'administration, ce qui permet d'ajouter rapidement des fonctionnalités à l'admin.
Le principe est simple:
- On liste dans un datalist les fichiers *.ascx
- Lorsque l'on clique dessus on les charges dynamiquement dans un panel

voilà c tout, c pas révolutionnaire mais ça peut aider !

Source / Exemple :


Télécharger le source (.ZIP) pour avoir le code complet.

Dans la page index.aspx en code behind:
-----------------------------------------------------

Imports System.IO

Public Class WebForm1
    Inherits System.Web.UI.Page

#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
    Protected WithEvents panelModule As System.Web.UI.WebControls.Panel
    Protected WithEvents dlModules As System.Web.UI.WebControls.DataList
    Protected WithEvents cmdModule As System.Web.UI.WebControls.LinkButton
    Protected WithEvents lblInfo As System.Web.UI.WebControls.Label

    '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

    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 Session("CurrentModules") Is Nothing Then
            lblInfo.Text = "Aucun module de sélectionné"
            lblInfo.Visible = True
        Else
            lblInfo.Visible = False
            panelModule.Controls.Add(LoadControl(Session("CurrentModules")))
        End If

        mDisplay_Files()

    End Sub

    Private Sub dlModules_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles dlModules.EditCommand
        Session("CurrentModules") = Session("ListModules")(e.Item.ItemIndex)
        Response.Redirect("index.aspx")
    End Sub

    Private Sub mDisplay_Files()

        Dim sFiles As Array
        Dim sFile As String
        Dim Array As New ArrayList

        sFiles = (Directory.GetFiles(Server.MapPath(""), "*.ascx"))
        For Each sFile In sFiles
            Array.Add(Path.GetFileName(sFile))
        Next

        'Affichage des fichiers dans une datalist
        With dlModules
            .DataSource = Array
            .DataBind()
            .Dispose()
        End With

        'Sauvegarde du tableau de fichier dans une session
        'pour gérer par la suite l'événement de la datalist
        Session("ListModules") = Array

    End Sub

End Class

Dans la page index.aspx en mode html:
-----------------------------------------------------
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="index.aspx.vb" Inherits="gestionnaire_ascx.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>Module d'administration</title>
		<meta content="True" name="vs_snapToGrid">
		<meta content="True" name="vs_showGrid">
		<LINK href="admin.css" type="text/css" rel="StyleSheet">
	</HEAD>
	<body>
		<form id="module" runat="server">
			<table cellSpacing="0" cellPadding="4" width="100%" border="0">
				<tr>
					<td vAlign="top" width="150">Modules installés:<br>
						<asp:DataList id="dlModules" RepeatColumns="1" RepeatDirection="Vertical" ShowFooter="False" ShowHeader="False"
							runat="server">
							<ItemTemplate>
								<font class="Intro11">
									<asp:LinkButton id="cmdModule" CommandName="edit" runat="server">
										<%# container.dataitem %>
									</asp:LinkButton></font>
							</ItemTemplate>
						</asp:DataList>
					</td>
					<td vAlign="top">
						<asp:Label id="lblInfo" runat="server">Label</asp:Label>
						<asp:Panel id="panelModule" runat="server"></asp:Panel>
						<br>
					</td>
				</tr>
			</table>
		</form>
	</body>
</HTML>

Ensuite ben ajouter vos contrôles ascx dans le même répertoire que l'index... (voir le zip)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

ToshiBaba
Messages postés
25
Date d'inscription
mercredi 28 mai 2003
Statut
Membre
Dernière intervention
24 septembre 2004
-
A propos du répertoire bin, voici un excellent article en anglais (framework 1.1) :
http://www.hanselman.com/blog/MovingTheCodeBehindAssembliesDLLsToADifferentFolderThanBINWithASPNET11.aspx

Ainsi vous pourrez avoir les dll de vos plugins ailleurs que dans le /bin de l'application principale :)
Focalizer
Messages postés
76
Date d'inscription
dimanche 19 mai 2002
Statut
Membre
Dernière intervention
8 mai 2006
-
Oui, mais c'est bon je viens de comprendre pourquoi cela merdais. Je n'avait pas config mon rep comme rep virtuel sous iis;

Ce qui donc fesait qu'il ne trouvais pas le rep /bin

Merci pour cette source, elle semble être assez interresante.
cs_jcq
Messages postés
211
Date d'inscription
vendredi 12 décembre 2003
Statut
Membre
Dernière intervention
15 janvier 2010
-
est-ce que tu as téléchargé le projet ?(dans le zip).
Focalizer
Messages postés
76
Date d'inscription
dimanche 19 mai 2002
Statut
Membre
Dernière intervention
8 mai 2006
-
Salut,

Lorsque je met ton code, j'optient l'erreur suivante :

Message d'erreur de l'analyseur: Impossible de charger le type 'gestionnaire_ascx.WebForm1'.

Erreur source:


Ligne 1 : <%@ Page Language="vb" AutoEventWireup="false" Codebehind="index.aspx.vb" Inherits="gestionnaire_ascx.WebForm1"%>
Ligne 2 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
Ligne 3 : <HTML>


Peux-tu m'aider ?

Merci d'avance

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.