Como adicionar um modelo para um UserControl?
Esta pergunta foi feita antes
Web Forms :: Suporte em tempo de design para controle de usuário com modelo personalizado no VS 2008VS 2008 Usando o ITemplate em um UserControl e obtendo um erro de renderização no tempo de designcomo mostrar os controles para controle de usuário da web em tempo de design?UserControl ITemplate Erro de tempo de design de propriedade - Fácil para um professor ...mas não custa perguntar novamente:
Como adicionar modelos a umUserControl
no ASP.net
Comece com um novoUserControl
5, que chamarei deContoso
:
public partial class Contoso: System.Web.UI.UserControl
{
}
Isso nos permitirá usar um novo controle:1
<Contoso>
Stuff in here
<Contoso>
Criar um públicoContentTemplate
propriedade do tipoITemplate
:
public partial class Contoso: System.Web.UI.UserControl
{
public ITemplate ContentTemplate { get; set; }
}
e adicione um número indeterminado de atributos aoContentTemplate
propriedade: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; }
}
isso nos permitirá adicionar<ContentTemplate>
para o controle em nosso arquivo aspx:1
<Contoso>
<ContentTemplate>
Stuff in here
</ContentTemplate>
</Contoso>
Próximo precisamos realmenteusa aContentTemplate
coisas, adicionando-o em algum lugar. Fazemos isso adicionando-o a um dos @ internos do nosso UserContrdiv
elementos.
A partir do nosso.aspx
arquivo que estava originalmente vazio:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>
nós adicionamos um paidiv
que manterá nossaContentTemplate
coisa
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Contoso.aspx.cs" Inherits="Contoso" %>
<div id="ContentDiv" runat="server"></div>
Então nós encher oContentTemplate
coisas nesse paidiv
durante o controleNiss:
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; }
}
Edita: Indique que sua classe implementaINamingContainer
:
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; }
}
OINamingContainer
interface @ não possui nenhum membro e é usada apenas para marcar seuUserControl
classe como algo.
E terminamos3. Agora podemos usar esse controle em nossa página aspx. Mas primeiro precisamos"registo" na parte superior da nossa página aspx:
<%@ Register src="Contoso.ascx" TagName="Contoso" tagprefix="uc" %>
Onde
Contoso.ascx
é o nome doascx
ArquivContoso
é o nome do elemento que usaremos para fazer referência a esse controle de usuáriouc
é um pouco de texto que teremos que colocar na frente deuc:Contoso
(eu usouc
tão curto para controle de usuário)Adicione o controle à nossa página:
<uc:Contoso ID="Crackers" runat="server">
<ContentTemplate>
Stuff goes here
</ContentTemplate>
</qwerty:Contoso>
E pronto!4
Edita: Esqueceu-se de adicionar o motivo pelo qual o descrito acima não funciona. Visual Studio mostra o erro:
Erro criando controle - Crackers
Type 'System.Web.UI.UserControl' não possui uma propriedade pública denominada 'ContentTemplate'
O que faz sentido, já queUserControl
não possui uma propriedade pública chamadaContentTemplate
- então eu mal posso culpar.
Esta questão é uma das séries Stackoverflow em andamento, "Modelo de controles de usuário":
Como adicionar um modelo para um UserControl?Como herdar do Control, em vez do UserControl?UserControl possui IsPostBack, mas o Controle nãoUserControl não tem propriedade pública denominada ContentTemplateComo especificar CodeFileBaseClass em web.config?Bonus ReadingComo: Criar controles de usuário ASP.NET com modeloriando um controle de usuário modelo com o ASP.Net 2.0ontroles de usuário modelo no ASP.NET para melhor manutenç Notas de rodapé1 Você nunca pode usar essa sintaxe. Essa é apenas uma forma fácil de ler e entender.2 Ninguém sabe quais atributos adicionar, ou por quê. Adicione mais ou menos atributos a gosto.3 Não realizado. Feito com o UserControl, mas não com o nosso trabalh4 Não realizado; não funciona.5 no site (não é um aplicativo da web, não é um assembly separado)