ASP CompositEControl & ScriptManager
-
23-09-2019 - |
Pergunta
Eu sou realmente novo no WebControl / CompositEControl World, e eu tenho uma pequena aula de teste com quem estou jogando. É apenas um LinkButton Isso atualiza quando clicado. As coisas funcionam bem quando eu deixo de fora de UpdatePanel. Mas quando tento executá -lo dentro, ainda recebo uma resposta de postagem de página inteira. Como posso fazer essa aula funcionar dentro de um UpdatePanel?
Aqui está a aula:
public class Test2 : CompositeControl
{
private static readonly object testButtonEvent = new object();
public event EventHandler OnTestClick
{
add { Events.AddHandler(testButtonEvent, value); }
remove { Events.RemoveHandler(testButtonEvent, value); }
}
private LinkButton testLinkButton;
public virtual string testLinkButtonText
{
get
{
object o = ViewState["testLinkButtonText"];
return (o == null) ? String.Empty : (string)o;
}
set
{
if (value == null)
ViewState.Remove("testLinkButtonText");
else
ViewState["testLinkButtonText"] = value;
}
}
protected override void OnInit(EventArgs e)
{
/* This stuff makes it ajax friendly but stops the text rendering
EnsureChildControls();
ScriptManager ScMan = ScriptManager.GetCurrent(Page);
if (ScMan != null)
{
ScMan.RegisterAsyncPostBackControl(testLinkButton);
} */
base.OnInit(e);
}
protected override void CreateChildControls()
{
Controls.Clear();
testLinkButton = new LinkButton();
testLinkButton.Command += new CommandEventHandler(testClick);
testLinkButtonText = "Test ViewState Text";
Controls.Add(testLinkButton);
}
void testClick(object sender, CommandEventArgs e)
{
testLinkButtonText = "Updated Text On " + DateTime.Now.ToLongTimeString();
}
protected override void Render(HtmlTextWriter writer)
{
RenderContents(writer);
}
protected override void RenderContents(HtmlTextWriter writer)
{
EnsureChildControls();
testLinkButton.Text = testLinkButtonText;
testLinkButton.RenderControl(writer);
}
}
O código em OnInit()
faz com que o controle poste corretamente, mas não recebo o texto atualizado para o LinkButton. Ainda está disparando o evento - quando eu depurar, posso vê -lo sendo chamado. Qual é a maneira correta de definir esse controle para uso em um UpdatePanel?
Uso, apenas no caso:
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
<ContentTemplate>
<cc:Test2 ID="jqTest02" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
Solução
Você precisa dar ao botão uma propriedade de identificação ... Isso é usado no JavaScript do lado do cliente que impulsiona o UpdatePanel
. Mais especificamente, está listado na lista de controles para interceptar e fazer postagens assíncronas para.
testLinkButton.ID = "btn";