Как включить ajax при выводе из System.Web.UI.WebControls.WebControl для элементов управления, которые создаются внутри WebControl - PullRequest
1 голос
/ 26 февраля 2010

Я создал класс, производный от System.Web.UI.WebControl. По сути, он отображает ссылки на нумерацию страниц (аналогично тому, что вы видите в верхней части GridView при включении) для использования над повторителем.

Я явно создаю некоторые якорные теги в моем элементе управления навигацией, но они не выполняют постбэки ajax. Насколько я понимаю, ajax требует POSTS для правильной работы? Ну, это были бы GET, которые, я думаю, являются проблемой.

Есть ли способ добиться того, что я пытаюсь сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

Хорошо, я понял это. Я просто заставил мой класс реализовать IPostBackEventHandler. Это заставляет ваш элемент управления запускать событие, когда пользователь что-то предпринимает. В моем случае это щелчок по номеру навигационной страницы: [1] [2] [3] [4] [5] [Далее>]

Затем внутри рендера, где я создаю теги Anchor, я добавляю это к каждому href (pageStartRow различна для каждого):

Параметры PostBackOptions = новые PostBackOptions (this, pageStartRow.ToString ()); writer.AddAttribute (HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference (options)); writer.RenderBeginTag (HtmlTextWriterTag.A);

Ключ должен передать что-то, что однозначно определяет, по какой ссылке они кликнули. Это делается как 2-й параметр конструктора для класса PostBackOptions.

Затем я добавил следующие элементы в свой класс WebControl:

// Определяет событие Click. открытый делегат void ClickHandler (отправитель объекта, GridPagingNavClickedEventArgs e); публичное событие ClickHandler Click;

// Вызов делегатов, зарегистрированных с событием Click. защищенная виртуальная пустота OnClick (GridPagingNavClickedEventArgs e) { если (Нажмите! = ноль) { Нажмите (это, е); } }

public void RaisePostBackEvent (string eventArgument) { GridPagingNavClickedEventArgs e = new GridPagingNavClickedEventArgs (Convert.ToInt32 (eventArgument)); OnClick (е); }

GridPagingNavClickedEventArgs содержит один элемент (pageNumber в моем случае).

Наконец, на моей странице aspx (где я использую веб-управление) я делаю это в Page_OnLoad:

gridNavTop.Click + = new GridPagingNavigation.ClickHandler (gridNavTop_Click);

и это код события:

private void gridNavTop_Click (отправитель объекта, GridPagingNavClickedEventArgs e) { StartRow = e.PageStartRow; }

Пока все внутри UpdatePanel, оно работает отлично!

0 голосов
/ 26 февраля 2010

Чтобы воспользоваться этим преимуществом, вы должны унаследовать ICallbackEventHandler и реализовать его методы следующим образом.

public class CtlTest : WebControl, ICallbackEventHandler
{

    private static readonly object EventClick = new object();

    public CtlTest() : base(HtmlTextWriterTag.A) { }

    public event EventHandler Click
    {
        add { base.Events.AddHandler(EventClick, value); }
        remove { base.Events.RemoveHandler(EventClick, value); }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + this.Page.ClientScript.GetCallbackEventReference(this, null, "null", null));
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        base.RenderContents(writer);
        writer.Write("Submit Query");
    }

    protected virtual void OnClick(EventArgs e)
    {
        EventHandler handler = this.Events[EventClick] as EventHandler;
        if (handler != null)
            handler(this, e);
    }

    #region ICallbackEventHandler Members

    string ICallbackEventHandler.GetCallbackResult()
    {
        return string.Empty;
    }

    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        this.OnClick(EventArgs.Empty);
    }

    #endregion

}

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

...