ASP CompositeControl & ScriptManager - PullRequest
       15

ASP CompositeControl & ScriptManager

1 голос
/ 29 января 2010

Я действительно новичок в мире WebControl / CompositeControl , и у меня есть небольшой тестовый класс, с которым я играю. Это просто LinkButton , который обновляется при нажатии. Все отлично работает, когда я оставляю его вне UpdatePanel . Но когда я пытаюсь запустить его внутри, я все равно получаю POST-ответ на всю страницу. Как я могу заставить этот класс работать внутри UpdatePanel ?

Вот класс:

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

}

Код в OnInit() заставляет элемент управления правильно отправлять сообщения, но я не получаю обновленный текст для LinkButton . Это событие все еще запускается - когда я отлаживаю, я вижу, как оно вызывается. Как правильно настроить этот элемент управления для использования в UpdatePanel ?

Использование, на всякий случай:

<asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <cc:Test2 ID="jqTest02" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

1 Ответ

1 голос
/ 29 января 2010

Вы должны присвоить кнопке свойство ID ... это используется в клиентском JavaScript, который управляет UpdatePanel. В частности, он указан в списке элементов управления для перехвата и асинхронной обратной передачи.

testLinkButton.ID = "btn";
...