Come posso includere markup ulteriore all'interno di una proprietà interna 'Contenuto' di un ASP.Net WebControl?

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

Domanda

Ho cercato il sito e non riesco a trovare una soluzione per il mio problema, quindi mi scuso se è già stato risposto (sono sicuro che qualcuno deve aver fatto questa prima).

Ho scritto una finestra popup jQuery che ho confezionato come un WebControl e IScriptControl. L'ultimo passo è quello di essere in grado di scrivere il markup all'interno dei tag del mio controllo. Ho usato l'attributo InnerProperty un paio di volte, ma solo per l'inclusione di liste di classi fortemente tipizzati.

Ecco la mia proprietà sul WebControl:

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

Ecco il codice HTML di quello che sto cercando:

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

Purtroppo non so che tipo di mia proprietà contenuto dovrebbe essere. Io fondamentalmente bisogno di replicare UpdatePanel del ContentTemplate.

Modifica :? Quindi la seguente consente un contenitore modello da creare automaticamente, ma nessun controllo arriva, cosa c'è di sbagliato in quello che sto facendo

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

EDIT2 : override i CreateChildControls consente i controlli all'interno del ITemplate da rendere:

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

Purtroppo non posso ora accedere ai controlli all'interno del ITemplate dal file codebehind sul file. Cioè se metto un pulsante all'interno del mio marchio come:

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

Ho quindi non può accedere btn_Test dal codice dietro:

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 : FIXED! Edit 2 è la soluion corretta. E 'stato solo visiva Studios 2010 sarà un dolore nei glutei. Chiuso l'applicazione e riaperto e tutti i miei controlli all'interno della proprietà Content erano accessibili nella pagina.

edit4 : Modifica 2 non risolvere il problema. Avevo già provato l'attributo [TemplateInstance(TemplateInstance.Single)] prima che qualcuno aveva parlato, però, al momento non ho pensato di aver fatto la differenza. Sembra visiva Studios 2010 è solo di essere strano oggi.

Poiché Ho rimosso il tag e portato a lavorare, ho assunto l'attributo non aveva fatto la differenza. Dal momento che risale al codice nuovamente i controlli sono più disponibili. Aggiunta la schiena attributo permesso tutto per il lavoro e per i controlli sia lato server accessibili. MADNESS . Mi sarà di accettare la risposta di Brian come ha accennato la correzione prima di chiunque altro.

È stato utile?

Soluzione

pubblica contenuti ITemplate

che poi si esegue il rendering per l'interfaccia utente, come:

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

//Render label

EDIT: assicurarsi che il modello anche definisce

[TemplateInstance(TemplateInstance.Single)]

come questo ti permette di accedere ai controlli all'interno del modello direttamente.

Altri suggerimenti

Si dovrebbe cercare di utilizzare questo:

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.

In caso contrario, si dovrebbe definire alcune proprietà per il controllo, come in questo articolo: http://msdn.microsoft.com/ it-it / library / 36574bf6% 28v = VS.90% 29.aspx


Aggiornamento: Secondo il commento in questo articolo su ContentTemplate proprietà della UpdatePanel:

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

è possibile ottenere controlli da ContentTemplate a causa del valore TemplateInstanceAttribute (UpdatePanel.ContentTemplate ha la TemplateInstance.Single).

Quindi, si dovrebbe usare questo codice:

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

Per ulteriori informazioni:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top