Comment puis-je inclure balises supplémentaires dans une propriété intérieure « Contenu » d'un ASP.Net WebControl?

StackOverflow https://stackoverflow.com/questions/2745886

Question

J'ai recherché le site et je ne peux pas trouver une solution à mon problème, donc des excuses si elle a déjà été répondu (je suis sûr que quelqu'un doit avoir demandé auparavant).

J'ai écrit une fenêtre Popup jQuery que je suis emballé comme un WebControl et IScriptControl. La dernière étape est d'être capable d'écrire le balisage dans les balises de mon contrôle. Je l'ai utilisé l'attribut InnerProperty quelques fois, mais seulement pour y compris les listes de classes fortement typées.

Voici ma propriété sur le WebControl:

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
   get
   {
      if (_content == null)
      {
         _content = new something???();
      }
      return _content;
   }
}
private something??? _content;

Voici la balise HTML de ce que je suis après:

   <ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
      Modal="true" WindowCaption="Test Window" CssClass="window">
      <Content>
         <div style="display:none;">
            <asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
         </div>
         <%--Etc--%>
         <%--Etc--%>
      </Content>
   </ctr:WebPopup>

Malheureusement, je ne sais pas ce que devrait être de type ma propriété contenu. Je essentiellement besoin de reproduire le UpdatePanel du ContentTemplate.

EDIT : Donc, ce qui suit permet un conteneur de modèle pour être automatiquement créé, mais pas de contrôle apparaissent, ce qui ne va pas avec ce que je fais

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
    get
    {
        return _content;
    }
    set
    {
        _content = value;
    }
}
private ITemplate _content;

EDIT2 : Redéfinition les CreateChildControls permet aux contrôles dans le ITemplate à rendre:

protected override void CreateChildControls()
{
   if (this.Content != null)
   {
      this.Controls.Clear();
      this.Content.InstantiateIn(this);
   }
   base.CreateChildControls();
}

Malheureusement, je ne peux pas accéder maintenant aux commandes dans le ITemplate du fichier codebehind sur le fichier. C'est à dire. si je mets un bouton dans ma marque comme ceci:

<ctr:WebPopup runat="server" ID="win_StatusFilter">
   <Content>
      <asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
   </Content>
</ctr:WebPopup>

Je ne peux donc pas accès btn_Test du code sous-jacent:

protected void Page_Load(object sender, EventArgs e)
{
   btn_Test.Text = "btn_Test is not present in Intellisense and 
      is not accessible to the page. It does, however, render correctly.";
}

EDIT3 : FIXE! Edit 2 est le soluion correct. Il était juste de Visual Studios 2010 étant une douleur dans les fesses. Fermé l'application et rouvert et tous mes contrôles dans la propriété de contenu sont accessibles sur la page.

EDIT4 : Edit 2 n'a pas résolu le problème. Je l'avais déjà essayé l'attribut [TemplateInstance(TemplateInstance.Single)] avant que quiconque ne l'avait mentionné, mais à l'époque je ne pensais pas qu'il avait fait une différence. Il apparaît Visual Studios 2010 vient d'être bizarre aujourd'hui.

Depuis que j'enlevé l'étiquette et il portait sur le travail, je suppose l'attribut n'a pas fait une différence. Depuis retourner à nouveau le code les contrôles sont devenus indisponibles. Ajout de l'arrière d'attribut dans tout permis de travail et pour les contrôles à côté serveur accessible. FOLIE . J'accepterai la réponse de Brian comme il a mentionné le correctif avant tout le monde.

Était-ce utile?

La solution

Contenu ITemplate publique

qui vous rendez à l'interface utilisateur comme:

Label label = new Label();
this.Content.InstantiateIn(label);

//Render label

EDIT: Assurez-vous que le modèle définit également de façon

[TemplateInstance(TemplateInstance.Single)]

car cela vous permet d'accéder aux commandes dans le modèle directement.

Autres conseils

Vous devriez essayer d'utiliser ceci:

win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.

Sinon, vous devez définir des propriétés de votre contrôle, comme dans cet article: http://msdn.microsoft.com/ ru-ru / bibliothèque / 36574bf6% 28V = VS.90% 29.aspx


Mise à jour: Selon les remarques dans cet article sur la propriété ContentTemplate du UpdatePanel:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contenttemplate(v=VS.90).aspx

vous pouvez obtenir des commandes de ContentTemplate en raison de la valeur TemplateInstanceAttribute (UpdatePanel.ContentTemplate a TemplateInstance.Single).

Vous ne devez utiliser ce code:

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content

Plus d'informations sur:

http: //msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=VS.90).aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top