Jak dodać szablon do UserControl?

To pytanie zostało zadane przed

Formy internetowe :: Obsługa czasu projektowania niestandardowej kontroli użytkownika w szablonie w VS 2008 VS 2008 Korzystanie z ITemplate w UserControl i uzyskiwanie błędu renderowania czasu projektowaniajak wyświetlić elementy sterujące dla kontroli użytkownika w czasie projektowania?UserControl ITemplate Błąd czasu projektowania właściwości - łatwy dla guru ...

ale pytanie nie jest zadawane:

Jak dodać szablon doUserControl w ASP.net

Co dotychczas nie działało

Zacznij od nowegoUserControl5, który nazywamContoso:

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

Pozwoli nam to użyć nowej kontroli:1

<Contoso>
    Stuff in here
<Contoso>

Utwórz publicznyContentTemplate właściwość typuITemplate:

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

i dodaj nieokreśloną liczbę atrybutów doContentTemplate własność2

//[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; }
}

pozwoli nam to dodać<ContentTemplate> do kontroli w naszym pliku aspx:1

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

Następnie musimy faktycznieposługiwać si theContentTemplate rzeczy, dodając je gdzieś. Robimy to, dodając go do jednego z wewnętrznych @ naszego UserContrdiv elementy

Rozpoczęcie od naszego.aspx plik, który był pierwotnie pusty:

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

dodajemy rodzicadiv, który pomieści naszeContentTemplate rzeczy:

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

Następnie wypychamyContentTemplate rzeczy do tego rodzicadiv podczas kontroliW ty:

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

Edytowa: Wskaż, że twoja klasa implementujeINamingContainer:

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

TheINamingContainernterfejs @ nie ma żadnych członków i służy jedynie do oznaczenia twojegoUserControl klasa jako coś.

I skończyliśmy3. Możemy teraz użyć tej kontrolki na naszej stronie aspx. Ale najpierw musimy"zarejestrować" it u góry naszej strony aspx:

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

Gdzie

Contoso.ascx to nazwaascx plikContoso to nazwa elementu, którego będziemy używać w celu odniesienia do tej kontroli użytkownikauc to fragment tekstu, który będziemy musieli umieścić przeduc:Contoso (używamuc jako skrót od kontrola użytkownika)

Dodaj formant do naszej strony:

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

I skończyliśmy!4

Edytowa: Nie pamiętam dodać przyczyny, dla której powyższe nie działa. Visual Studio pokazuje błąd:

Error Creating Control - Crackers

Type „System.Web.UI.UserControl” nie ma właściwości publicznej o nazwie „ContentTemplate”

Co ma sens, ponieważUserControl nie ma własności publicznej o nazwieContentTemplate - więc nie mogę tego winić.

,Seri

To pytanie jest jednym z bieżących serii Stackoverflow, „Templating control user”:

Jak dodać szablon do UserControl?Jak dziedziczyć po Control, a nie UserControl?UserControl ma IsPostBack, ale Control nieUserControl nie ma właściwości publicznej o nazwie ContentTemplateJak mogę określić CodeFileBaseClass z web.config?Bonus ReadingJak: Tworzenie kontrolek użytkownika ASP.NET w szablonie Tworzenie szablonowej kontroli użytkownika za pomocą ASP.Net 2.0 Wzorowane kontrole użytkowników w ASP.NET dla lepszej konserwacji Przypisy1 Nigdy nie możesz użyć tej składni. To tylko łatwy do odczytania i zrozumienia formularz.2 Nikt nie wie, jakie atrybuty dodać i dlaczego. Dodaj więcej lub mniej atrybutu do smaku.3 Nie skończone. Wykonano z UserControl, ale nie nasza praca.4 Nie skończone; to nie działa.5 na stronie internetowej (nie jest aplikacją internetową, nie ma osobnego zestawu)