Добавление серверного события в элемент управления extender - PullRequest
5 голосов
/ 01 сентября 2008

У меня есть элемент управления расширением, который вызывает событие OnTextChanged в текстовом поле через 500 мс после того, как пользователь закончил печатать. Проблема в том, что OnTextChanged возникает, когда текстовое поле теряет фокус, что вызывает проблемы (из-за обратной передачи).

Что я хотел бы сделать, так это дать экстентору возможность управлять своим собственным событием на стороне сервера (скажем, OnDelayedSubmit), чтобы я мог обрабатывать его отдельно. Событие будет происходить из сценария поведения элемента управления-расширителя (после задержки в 500 мс), поэтому ввод __doPostBack в onchanged не вариант.

Может кто-нибудь пролить свет на то, как это сделать?

1 Ответ

5 голосов
/ 01 сентября 2008

После долгих чтений по элементам управления расширением и JavaScript, я собрал воедино решение, которое, похоже, работает до сих пор.

Основная хитрость заключалась в получении необходимого кода обратной передачи со стороны сервера в сценарий поведения на стороне клиента. Я сделал это с помощью ExtenderControlProperty (который установлен в функции OnPreRender элемента управления), а затем eval'd в сценарии поведения. Все остальное было основным средством обработки событий.

Итак, теперь файл .cs моего элемента управления расширением выглядит примерно так:

public class DelayedSubmitExtender : ExtenderControlBase, IPostBackEventHandler
{
    // This is where we'll give the behavior script the necessary code for the 
    // postback event
    protected override void OnPreRender(EventArgs e)
    {
        string postback = Page.ClientScript.GetPostBackEventReference(this, "DelayedSubmit") + ";";
        PostBackEvent = postback;
    }

    // This property matches up with a pair of get & set functions in the behavior script
    [ExtenderControlProperty]
    public string PostBackEvent
    {
        get
        {
            return GetPropertyValue<string>("PostBackEvent", "");
        }
        set
        {
            SetPropertyValue<string>("PostBackEvent", value);
        }
    }

    // The event handling stuff
    public event EventHandler Submit;  // Our event

    protected void OnSubmit(EventArgs e)  // Called to raise the event
    {
        if (Submit != null)
        {
            Submit(this, e);
        }
    }

    public void RaisePostBackEvent(string eventArgument)  // From IPostBackEventHandler
    {
        if (eventArgument == "DelayedSubmit")
        {
            OnSubmit(new EventArgs());
        }
    }

}

А мой скрипт поведения выглядит примерно так:

DelayedSubmitBehavior = function(element) {
    DelayedSubmitBehavior.initializeBase(this, [element]);

    this._postBackEvent = null; // Stores the script required for the postback
}

DelayedSubmitBehavior.prototype = {
    // Delayed submit code removed for brevity, but normally this would be where 
    // initialize, dispose, and client-side event handlers would go

    // This is the client-side part of the PostBackEvent property
    get_PostBackEvent: function() {
        return this._postBackEvent;
    },
    set_PostBackEvent: function(value) {
        this._postBackEvent = value;
    }

    // This is the client-side event handler where the postback is initiated from
    _onTimerTick: function(sender, eventArgs) {
        // The following line evaluates the string var as javascript,
        // which will cause the desired postback
        eval(this._postBackEvent);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...