Modification du <@ register dynamiquement

Signaler
Messages postés
26
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
7 juillet 2008
-
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
-
Bonjour,


En asp.net 2.0, peut importe le language, j'aimerai pouvoir modifier
dynamiquement le "src" de la directive @register quelqu'un aurait-il
une solution ?

Sinon éventuellement je pourrai surchargé l'objet ou la méthode utilisé
par cette directive, mais je ne l'ai pas trouvé dans reflector..


Et un loadcontrol ne me convient pas.


Merci pour vos futurs pistes !!!

targ:-)s

7 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

Ce n'est pas possible, les directives de pages sont une sorte d'instruction de précompilation. Ce que tu demandes c'est comme vouloir modifier les réferences d'une assembly lors de l'execution.

Pourquoi as tu besoin faire cela ? A partir de là on trouvera une solution pour accomplir ce que tu veux.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
26
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
7 juillet 2008

D'autre piste de m'interreserait pas :p Je vais tenter d'expliquer, mais pas évident car le contexte est assez complexe.


J'ai une arborescence dans mon site qui fonctionne comme les css si on
veut, avec des fichiers génériques, puis des fichiers plus précis. avec
x niveau.

J'ai une fonction qui me permet, avec différent critère d'exécuter
cette mecanqiue. ex : donne moi le fichier le plus precis pour tel
critere, et la je vais recupérer soit ~/monfichier, soit
~/lvl1/monfichier, soit ~/lvl2/monfichier

J'ai besoin de faire la même chose avec des ascx.


J'ai une page, qui va dire charge moi l'ascx, et je veux utiliser ma
fonction. donc j'aurai le <@ register src="~/mecanique/monfichier"
et mecanique declanche l'appel a la fonction qui recupere le bon
fichier en fonction de critere. donc l'ascx charger dans la page pourra
etre different suivant les critéres.


Pour etre plus précis j'aurai x Ascx, qui hériteront du même .vb, mais avec des design totalement différent.


Le fait de passer par le register permet de pouvoir renseigner des
properties sur les ascx. Le loadcontrol me pose trop de contrainte.


Donc la solution que je cherche c'est, comment surcharger la directive register, pour modifier le fonctionnement du src... mais si ce n'est pas possible effectivement... je vais regarder du coté des itemplate peut etre


Voila j'espere que j'ai été clair :p

targ:-)s
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Ton problème est interessant :-)

Je n'ai pas le temps d'y réfléchir tout de suite, mais si tu vois que j'oublie, n'oublie pas de me relancer.

Les ITemplates sont une piste, mais ca nécessite d'écrire un customcontrol plutot qu'un simple UserControl (mais dans la philosophie t'en es pas trop loin) et ca me parait être la solution la plus adapté à ton cas.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
26
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
7 juillet 2008

Merci. Je cherche :) Je mettrai la soluce si je trouve :)

@++
targ:-)s
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Je viens d'y réfléchir un petit instant, et en effet le plus adapté dans ton cas est  d'utiliser un ITemplate.

en pseudoCode

public class PouetControl : CompositeControl {

    public ITemplate PouetTemplate {get;set}
    public String PouetUrl {get;set;} 

    protected override CreateChildControls(){
        if (this.PouetTemplate != null){
              this.PouetTemplate = Page.LoadTemplate(this.PouetUrl);
        }
        XXXContainer container = new XXXContainer(this); 
        this.PouetTemplate.instantiateIn(container); 
        this.Controls.Add(container);
    }
}

Puis après tu peux utiliser soit directement le PouetTemplate dans ton code soit charger le template à partir d'un ascx dans le code behind.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
26
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
7 juillet 2008

Hello, merci pour ta réponse.
Je m'en suis servi ainsi qu'un autre article US.

Là j'ai le code de mon TemplateCTL.ascx :
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="TemplateCTL.ascx.vb" Inherits="test_TemplateCTL" %>

   

Là j'ai le code de mon TemplateCTLascx.vb :
_
Partial Class test_CD_TemplateCTL
    Inherits Targos.Web.UI.UserControl

    Private _ContentTemplate As ITemplate

    _
    Public Property ContentTemplate() As System.Web.UI.ITemplate
        Get
            Return _ContentTemplate
        End Get
        Set(ByVal value As System.Web.UI.ITemplate)
            _ContentTemplate = value
        End Set
    End Property

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)

        _ContentTemplate = Page.LoadTemplate(getPrmUrl(me.Criterion, "~/test/Template.ascx"))
        If (_ContentTemplate IsNot Nothing) Then
            _ContentTemplate.InstantiateIn(phContent)
        End If

    End Sub

End Class

getPrmUrl est la fonction qui suivant mes criteres me retourne le template a utiliser

ensuite dans le template.ascx j'ai juste :
<%@ Control Language="VB" ClassName="Template" %>

Jusque là tout va bien. Le templa
Par contre je voudrai pouvoir accéder à lbTest dans mon fichier "source" TemplateCTL. J'ai essayé phTemplate.findcontrol mais il n'y a pas de control. Je suppose que le InstantiateIn ne le permet pas ?

Une piste ?

Merci encore

targ:-)s
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Après le init (donc dans le load) tu devrais avoir accès à ton contrôle via phContent.FindControl("lbTest"), mais puisque PlaceHolder n'implémente pas INamingContainer je ne suis pas sur que ca fonctionne (mais je suis pas sur que c'est vraiment INamingContainer qui va aider).

Je te conseille de faire un vrai CustomControl et non un UserControl, les UserControl sont compliqués et tu risques de te complexifier la tache si t ne connais pas le fonctionnement interne des Control.

Regarde mon pseudo Code ainsi que la classe Login dans Reflector elle fait à peu pres la meme chose que ce que tu veux.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant