Wie füge ich ein Templating zu einem UserControl hinzu?

Diese Frage wurde bereits gestellt

Web Forms :: Entwurfszeitunterstützung für benutzerdefinierte Benutzersteuerelemente in VS 2008VS 2008 Verwenden der ITemplate in einem UserControl und Abrufen eines Entwurfszeit-Wiedergabefehlers Wie werden die Steuerelemente für die Webbenutzersteuerung in der Entwurfszeit angezeigt?UserControl ITemplate Property Design Time Error - Einfach für einen Guru ...

aber es tut nicht weh, es noch einmal zu fragen:

Wie füge ich einem @ ein Template hinzUserControl in ASP.net

Was hat bisher nicht funktioniert

Start mit einem neuenUserControl5, das werde ich @ nennContoso:

public partial class Contoso: System.Web.UI.UserControl
{
}

Dadurch können wir ein neues Steuerelement verwenden:1

<Contoso>
    Stuff in here
<Contoso>

Erstelle eine öffentlicheContentTemplate Eigenschaft vom TypITemplate:

public partial class Contoso: System.Web.UI.UserControl
{
   public ITemplate ContentTemplate { get; set; }
}

und füge dem @ eine unbestimmte Anzahl von Attributen hinContentTemplate Eigentum2

//[ParseChildren(true)]
[ParseChildren(true, "ContentTemplate")]
//[ParseChildren(false)]
public partial class Contoso: System.Web.UI.UserControl
{
   [TemplateContainer(typeof(ContentContainer))]
   [TemplateInstance(TemplateInstance.Single)]
   [PersistenceMode(PersistenceMode.InnerProperty)]   
   //[PersistenceMode(PersistenceMode.InnerDefaultProperty)] 
   [Browsable(true)]
   //[Browsable(false)]
   [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
   //[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
   public ITemplate ContentTemplate { get; set; }
}

uf diese Weise können wir @ hinzufüge<ContentTemplate> zum Steuerelement in unserer ASPX-Datei:1

<Contoso>
   <ContentTemplate>
       Stuff in here
   </ContentTemplate>
</Contoso>

Nächste müssen wir tatsächlichverwende dasContentTemplate Zeug, indem man es irgendwo hinzufügt. Wir tun dies, indem wir es zu einem internen @ unseres UserControls hinzufügediv elements.

Starten von unserem.aspx Datei, die ursprünglich leer war:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>

Wir fügen ein Elternteil hinzudiv das wird unser @ haltContentTemplate Zeug

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>
<div id="ContentDiv" runat="server"></div>

Dann stopfen wir dieContentTemplate Zeug in das übergeordnetediv während der KontrolleDri:

public partial class Contoso: System.Web.UI.UserControl
{
   protected override void OnInit(EventArgs e)
   {
      base.OnInit(e);

      //If there's content, then put it into our ContentDiv div
      if (this.ContentTemplate != null)
         this.ContentTemplate.InstantiateIn(ContentDiv);
   }

   [PersistenceModeAttribute(PersistenceMode.InnerProperty)]    
   [TemplateInstanceAttribute(TemplateInstance.Single)]
   [Browsable(true)]
   [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
   public ITemplate ContentTemplate { get; set; }
}

Bearbeite: Geben Sie an, dass Ihre Klasse @ implementierINamingContainer:

public partial class Contoso: System.Web.UI.UserControl: INamingContainer
{
   protected override void OnInit(EventArgs e)
   {
      base.OnInit(e);

      //If there's content, then put it into our ContentDiv div
      if (this.ContentTemplate != null)
         this.ContentTemplate.InstantiateIn(ContentDiv);
   }

   [PersistenceModeAttribute(PersistenceMode.InnerProperty)]    
   [TemplateInstanceAttribute(TemplateInstance.Single)]
   [Browsable(true)]
   [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
   public ITemplate ContentTemplate { get; set; }
}

DasINamingContainer interface hat keine Mitglieder und wird nur verwendet, um Ihr @ zu markiereUserControl Klasse als etwas.

Und wir sind fertig3. Wir können dieses Steuerelement jetzt in unserer aspx-Seite verwenden. Aber zuerst müssen wir"registrieren" es oben auf unserer aspx Seite:

<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>

Woher

Contoso.ascx ist der Name desascx DateContoso ist der Name des Elements, mit dem wir auf dieses Benutzersteuerelement verweisen.uc ist ein Text, den wir vor @ setzen müssuc:Contoso (ich benutzeuc als Abkürzung fürNutzerkontroll)

Fügen Sie das Steuerelement zu unserer Seite hinzu:

<uc:Contoso ID="Crackers" runat="server">
    <ContentTemplate>
        Stuff goes here
    </ContentTemplate>
</qwerty:Contoso>

Und wir sind fertig!4

Bearbeite: Ich habe vergessen, den Grund hinzuzufügen, warum das oben genannte nicht funktioniert. Visual Studio zeigt den Fehler:

Error Creating Control - Crackers

Type 'System.Web.UI.UserControl' hat keine öffentliche Eigenschaft namens 'ContentTemplate'

Was Sinn macht, daUserControl hat keine öffentliche Eigenschaft namensContentTemplate - so kann ich es kaum tadeln.

,Seri

Diese Frage ist eine in der laufenden Stackoverflow-Reihe, "Vorlagen für Benutzersteuerelemente":

Wie füge ich ein Templating zu einem UserControl hinzu?Wie wird von Control und nicht von UserControl geerbt?UserControl hat IsPostBack, Control jedoch nichtUserControl hat keine öffentliche Eigenschaft namens ContentTemplateWie gebe ich CodeFileBaseClass in web.config an?Bonus Reading Gewusst wie: Erstellen von ASP.NET-Benutzersteuerelementen mit VorlagenErstellen eines Templated User Controls mit ASP.Net 2.0Templated User Controls in ASP.NET für eine bessere Wartbarkeit Fußnoten1 Sie können diese Syntax niemals verwenden. Das ist nur ein einfach zu lesendes und zu verstehendes Formular.2 Niemand weiß, welche Attribute hinzugefügt werden sollen oder warum. Fügen Sie mehr oder weniger Attribute zum Geschmack hinzu.3 Nicht durchgeführt. Fertig mit dem UserControl, aber nicht mit unserer Arbeit.4 Nicht durchgeführt; es funktioniert nicht.5 auf der Website (keine Webanwendung, nicht in einer separaten Assembly)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage