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
Start mit einem neuenUserControl
5, 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.
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)