إضافة حدث من جانب الخادم للتحكم في الموسع

StackOverflow https://stackoverflow.com/questions/37555

  •  09-06-2019
  •  | 
  •  

سؤال

لدي عنصر تحكم موسع يقوم برفع مربع النص OnTextChanged الحدث بعد 500 مللي ثانية من انتهاء المستخدم من الكتابة.المشكلة في هذا هي أن OnTextChanged يتم رفعه عندما يفقد مربع النص التركيز، مما يسبب مشاكل (بسبب إعادة النشر).

ما أود فعله هو منح الموسع التحكم في الحدث الخاص به من جانب الخادم (على سبيل المثال، OnDelayedSubmit) حتى أتمكن من التعامل معها بشكل منفصل.سينشأ الحدث في البرنامج النصي لسلوك عنصر التحكم الموسع (بعد تأخير قدره 500 مللي ثانية)، لذا فإن وضع ملف __doPostBack في onchanged ليس خيارا.

هل يمكن لأي شخص أن يلقي الضوء على كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

بعد الكثير من القراءة حول عناصر التحكم في الموسع وجافا سكريبت، قمت بتجميع حل يبدو أنه يعمل حتى الآن.

كانت الحيلة الرئيسية هي الحصول على رمز إعادة النشر الضروري من جانب الخادم إلى البرنامج النصي للسلوك من جانب العميل.لقد فعلت ذلك باستخدام ExtenderControlProperty (الذي تم تعيينه في عنصر التحكم OnPreRender وظيفة)، ومن ثم تقييمها في البرنامج النصي للسلوك.وكان الباقي عبارة عن أشياء أساسية للتعامل مع الأحداث.

والآن أصبح التحكم في الموسع الخاص بي .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);
    }
}

الآن يمكن التعامل مع الحدث من جانب الخادم بنفس الطريقة التي تتعامل بها مع حدث ما على أي عنصر تحكم آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top