2008-10-29 14 views
1

J'ai rencontré un problème étrange qui n'a aucun sens pour moi. J'essaie de configurer dynamiquement les contrôles de contenu MasterPage sur une page. Je l'ai travaille bien avec le code suivant:L'ajout dynamique de blocs de contenu à Masterpage échoue après Master.FindControl

protected override void OnPreInit(EventArgs e) 
    { 
     base.OnPreInit(e); 

     MasterPageFile = "~/MasterPages/Default.master"; 

     string existantContentPlaceHolderID = "ContentPlaceHolder1"; 
     string nonExistantContentPlaceHolderID = "foo"; 

     //Control c = Master.FindControl(existantContentPlaceHolderID); 
     //Control c1 = Master.FindControl(nonExistantContentPlaceHolderID); 

     TextBox t = new TextBox 
         { 
          Text = "Text" 
         }; 

     ITemplate iTemplate = new GenericITemplate(container => container.Controls.Add(t)); 

     AddContentTemplate(existantContentPlaceHolderID, iTemplate); 

    } 

    public delegate void InstantiateTemplateDelegate(Control container); 

    public class GenericITemplate : ITemplate 
    { 
     private readonly InstantiateTemplateDelegate m_instantiateTemplate; 

     public void InstantiateIn(Control container) 
     { 
      m_instantiateTemplate(container); 
     } 

     public GenericITemplate(InstantiateTemplateDelegate instantiateTemplate) 
     { 
      m_instantiateTemplate = instantiateTemplate; 
     } 
    } 

Cela fonctionne très bien, sauf que je veux être en mesure de bien vérifier que les contentPlaceHolderIDs existent sur le MasterPage avant d'appeler AddContentTemplate que la page renvoie une erreur si vous ajoutez un contrôle de contenu qui pointe vers un ContentPlaceHolder inexistant.

Le problème que j'ai est que dans l'exemple ci-dessus lorsque j'appelle l'une des lignes Master.FindControl commentées, le TextBox ne rend plus.

Est-ce que quelqu'un a des idées pourquoi cela pourrait être ... Je ne peux pas faire la tête ou la queue de ce qui se passe.

Merci, Max

Répondre

2

Le problème est que AddContentTemplate juste enregistre ses paramètres dans une table de hachage prêt à combiner avec l'instance de page maître lors de sa création. L'appeler après la création de la page maître ne fera rien et lire la propriété Master entraîne la création de la page maître.

La meilleure façon que je peux voir autour de cela est de créer une instance distincte de la page principale avec LoadControl, que vous pouvez inspecter sans affecter propriété principale de la page ...

MasterPage testMaster = (MasterPage) LoadControl(MasterPageFile); 
Control c = testMaster.FindControl(existantContentPlaceHolderID); 

Il y a certains frais généraux dans créer une seconde instance, mais ce n'est pas évident pour moi de savoir si cela vaudra la peine de s'inquiéter.

+0

hmm ... c'est intéressant, il ne m'est pas arrivé que l'accès à Master commence à être futzing avec des trucs, mais cela a du sens. J'ai seulement un nombre limité de pages maîtres, donc je vais essayer votre solution, mais jeter le contrôle chargé dans un cache avec une mise en cache mise en retrait dans le fichier maître ... –

Questions connexes