Como passar o nome do método para o controle de servidor personalizado em asp.net?
-
09-06-2019 - |
Pergunta
Estou trabalhando em um controle de servidor do cliente que estende outro controle.Não há problema em anexar outros controles no formulário.
em vb.net: Parent.FindControl(TargetControlName)
Gostaria de passar um método para o controle na marcação ASPX.
por exemplo: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">
Então, tentei usar a reflexão para acessar o nome do método fornecido no pai.
Algo como (em VB)
Dim pageType As Type = Page.GetType
Dim CallbackMethodInfo As MethodInfo = pageType.GetMethod( "MethodName" )
'Also tried
sender.Parent.GetType.GetMethod("MethodName")
sender.Parent.Parent.GetType.GetMethod("MethodName")
O método não foi encontrado porque simplesmente não faz parte da página.Para onde devo procurar?Tenho quase certeza de que isso é possível porque vi outros controles fazerem algo semelhante.
Esqueci de mencionar que minha solução alternativa é fornecer os eventos de controle e anexar a eles no Code-behind.
Solução
Se você quiser passar um método na marcação ASPX, você precisa usar o método Browsable
atributo em seu código no evento.
VB.NET
<Browsable(True)> Public Event InitializeStuffCallback
C#
[Browsable(true)]
public event EventHandler InitializeStuffCallback;
Referência:Atributos de tempo de design para componentes e Classe BrowsableAttribute
Todos os eventos, propriedades ou o que quer que seja, precisam estar no code-behind do controle com o atributo navegável para que você possa alterá-lo no código da tag.
Outras dicas
Normalmente você não precisaria obter o método via reflexão.Dentro do seu controle de usuário, defina um evento público (desculpe, não conheço a sintaxe vb, então será em c#)
public event EventHandler EventName;
Agora, dentro da sua página aspx, ou qualquer contêiner do controle de usuário, defina um método protegido que corresponda ao EventHandler:
protected void MyCustomerControl_MethodName(object sender, EventArgs e) { }
Agora, dentro da sua marcação, você pode usar
<c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName">
Sua solução alternativa é na verdade a melhor resposta.Se você tiver código que deve ser executado em uma determinada parte do ciclo de vida do seu controle, você deve expor eventos para permitir que o contêiner estenda o ciclo de vida com funcionalidade personalizada.
buyutec e Jesse Dearing têm uma resposta aceitável.
[Browsable(true)]
permite que você veja a propriedade na janela Propriedades.Porém, o evento não aparece, o que para mim não faz diferença.
O que esqueci anteriormente foi o fato de que quando você faz referência a um controle a partir da tag, ele termina em On.
Cada página ASP.NET é classe própria Herdado de Page
como em:
class MyPage : Page
Portanto, para encontrar esse método via Reflection, você deve obter o tipo correto, que é o tipo da classe da página que armazena o código da página.
Suponho que você precise suportar múltiplas páginas para que esse controle seja instanciado. Acredito que você possa encontrar o tipo filho de qualquer instância de Page via Reflection, mas não me lembro como, mas você deve conseguir fazer isso.
mas...como todo mundo disse, esse caso é o que eventos são para.