Frage

Ich habe einen extender-Steuerelement, das wirft eine textbox ist OnTextChanged event 500ms, nachdem der Benutzer mit dem schreiben fertig sind.Das problem mit diesem ist, dass OnTextChanged wird ausgelöst, wenn das Textfeld den Fokus verliert, die Probleme verursacht (weil der postback).

Was ich tun möchte, ist geben Sie den extender Steuern, Ihre eigenen server-side event (sagen, OnDelayedSubmit), so kann ich verarbeiten, es separat.Die Veranstaltung findet Ihren Ursprung in den extender-Steuerelement Verhalten Skript (nach der 500ms delay), so setzen ein __doPostBack in onchanged ist nicht eine option.

Kann jemand Licht auf, wie dies angehen?

War es hilfreich?

Lösung

Nach viel Lesen auf extender controls und JavaScript habe ich zusammen geflickt, eine Lösung, die scheint zu funktionieren bisher.

Der wichtigste trick war, die notwendigen postback-code von server-Seite auf der client-side script verhält.Ich habe dies mit einem ExtenderControlProperty (die festgelegt ist in der Steuerung OnPreRender Funktion), und dann eval würde im Verhalten script.Der rest war einfach event-handling-Zeug.

So nun meine extender-Steuerelement .cs die Datei sieht ungefähr so aus:

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

}

Und meinem Verhalten-Skript sieht ungefähr so aus:

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

Nun wird der server-side-event kann auf die gleiche Weise behandelt würde man ein Ereignis zu behandeln, die auf jede andere Steuern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top