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
Zacznij od nowegoUserControl
5, 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; }
}
TheINamingContainer
nterfejs @ 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ć.
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)