Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Client-side scripting που κάνει raise server-side events

Îåêßíçóå áðü ôï ìÝëïò anjelinio. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 27-09-2005, 16:28. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-09-2005, 18:50 5745

    Client-side scripting που κάνει raise server-side events

    Καλησπέρα παιδιά ...

    Σήμερα στη δουλειά, μου ζητήθηκε το εξής: Θα θέλαμε οι σελίδες μας, απο ένα client-side script να κάνουν postback, και να γίνεται raise ένα event στο server. Αυτό ήταν απόρροια μιας κατάστασης, όπου ένα modal dialog χρειαζόταν να κάνει refresh (το λέμε και reload εδω) τη σελίδα η οποία το άνοιξε, και για διάφορους λόγους ένα απλό document.location.reload() δεν εξυπηρετούσε τους σκοπούς μας.

    Μετα απο κάποια ώρα που χρειάστηκα να "πιάσω" (είμαι και λίγο αργός .. ) νοηματικά το ζητούμενο, το έκανα τελικά, και είπα να μοιραστώ την εμπειρία γιατί .. είναι αν μη τι άλλο, έστω και ελάχιστα ενδιαφέρον :)

    Λοιπόν ... το framework μας παρέχει τη δυνατότητα να κάνουμε generate ένα  τέτοιο script,  χρησιμοποιώντας τη μέθοδο

    GetPostBackEventReference(Control ctrl)  : string
    GetPostBackEventReference(Control ctrl, string argument) : string

    Η μέθοδος "γυρίζει" ένα string το οποίο περιέχει τον κώδικα σε JavaScript που κάνει αυτή τη δουλειά ... οκ, σε αυτό το σημείο σκέφτηκα εγώ ... "εμμμ ... οκ .. και τώρα .. πως πιάνω εγώ αυτό το event;;; Και τί είναι αυτές οι παράμετροι τύπου Control & string;;;" ... έλα παναγία μου ..

    Λοιπόν, στο framework κάπου, υπάρχει το interface IPostBackEventHandler. Αυτό, ορίζει μια μοναδική μέθοδο:

    RaisePostBackEvent(string eventArgument) : void

    Ωραία, σκέφτηκα. 'Αρα, αν κάνω τη σελίδα μου να υλοποιεί αυτό το interface, και βάλω τον JavaScript κώδικα απο παραπάνω σ'ενα button ( ή τελος πάντων τον καλέσω κάπως ... ), θα κάνω τη δουλειά μου και θα καλεστεί η RaisePostBackEvent όμορφα και ωραία. Λάθος ! :D

    Το παραπάνω αρνήθηκε να δουλέψει. ( Αργότερα έμαθα το λόγο, τον οποίο θα σας πώ στο τέλος :) )

    Οπότε, αποφάσισα την πεπάτημένη του ... workaround. Έγραψα μια μικρή κλάσση, η οποία κάνει inherit το Control, και implement το IPostBackHandler:

    class WebClientPostBackHandler : Control, IPostBackEventHandler {
     

          private allWebBasePage _parent = null;                    

          public allWebClientPostBackHandler(WebBasePage parent){

              this._parent = parent;

          }

          #region IPostBackEventHandler Members

          public void RaisePostBackEvent(string eventArgument)

          {

              if(_parent!=null)

                  _parent.PageReloading();

          }

          #endregion

     }

    Όλες μου οι σελίδες είανι derived  (έτσι κι αλλιώς) απο την WebBasePage, οπότε ήταν εύκολο για μένα να προσθέσω στην κλάσση τη μέθοδο PageReloading ως virtual, έτσι ώστε να την υλοποιήσω όταν χρειάζεται.

    /// <summary>

    /// Called whenever the page is 'refreshed' using client-side scripting (awep_formReload() method)

    /// </summary>

    protected virtual void PageReloading(){

           // Do nothing.

           //Response.Write("RELOADED!!!");

    }

    Αμέσως μετά, πρόσθεσα ένα member variable στην WebBasePage, τύπου WebClientPostBackHandler, την οποία κάνω instantiate στον constructor:

    private WebClientPostBackHandler _clientPostBackHandler = null;

     

    public WebBasePage() : base() {

           // Register the event handler

           _clientPostBackHandler = new WebClientPostBackHandler(this);

    }



    Δεν ξεχνώ να προσθέσω αυτό το μικρό Control στο Control tree της σελίδας μου στην OnInit(...) :

    this.Controls.Add(this._clientPostBackHandler);

    Και τέλος, να κάνω register το script το οποίο κάνει όλη αυτή τη μαγεία πραγματικότητα:

    private void RegisterReloadScript(){
     

    if(!this.IsClientScriptBlockRegistered(CLIENTSCRIPTKEY_Reload))

           {

                  string strClientReloadScript = this.GetPostBackEventReference(this._clientPostBackHandler);
     

                  System.Text.StringBuilder stb = new System.Text.StringBuilder();

                  stb.Append("<script language=\"javascript\">");

                  stb.Append("function formReload() { ");

                  stb.Append(strClientReloadScript);

                  stb.Append("}");

                  stb.Append("</script>");
     

                  string strClientScript = stb.ToString();

                  this.RegisterClientScriptBlock(CLIENTSCRIPTKEY_Reload, strClientScript);

           }

    }

    ... και καλώ την παραπάνω μέθοδο στην onLoad(EventArgs e). H σελίδα που παράγεται, περιέχει τη JavaScript function formReload(), όταν καλείται η οποία, η σελίδα γίνεται post back, οι event handlers παίρνουν φωτιά, και τελικά καλείται η PageReloading() στο server-side κώδικα της εκάστοτε σελίδας :)

    Πολύ καλό βράδυ μας !!!

    Υ.Γ. ... όπως ανέφερα παραπάνω, αν κάνετε τη σελίδα σας να υλοποιεί τον IPostBackEventHandler, η RaisePostBackEvent(...) δε θα καλεστεί ποτέ. Αυτό συμβαίνει διότι η Page κάνει implement το interface IPostBackDataEventHandler, του οποίου η υλοποίηση "κρύβει" τη μέθοδο του "απλού" IPostBackEventHandler ... ( κι επίσης ... σκέφτηκα να μη μπλέξω με ένα τοσο "ευαίσθητο" μέρος της Page  - είναι η μέθοδος που καλείται σε κάθε postback και παίρνει/δίνει/πείτε το όπως θέλετε τα data απ'τα controls της φόρμας στο Control tree της σελίδας, οπότε .. καλύτερα να μην τη χαλάμε, να'μαστε και σίγουροι :D )
     





    Angel
    O:]
  •  26-09-2005, 21:13 5749 σε απάντηση της 5745

    Απ: Client-side scripting που κάνει raise server-side events

    Δεν κοίταξα τον κώδικά σου, αλλά το Ajax δεν κάνει ακριβώς αυτό;
    Χρήστος Γεωργακόπουλος
  •  26-09-2005, 21:53 5750 σε απάντηση της 5749

    Απ: Client-side scripting που κάνει raise server-side events

    Και εμένα με μια πρώτη ματιά, αυτή την εντύπωση που έδωσε...

     

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  27-09-2005, 11:19 5756 σε απάντηση της 5750

    Απ: Client-side scripting που κάνει raise server-side events

    Όχι ρε παιδιά, δεν περνάω control data εγώ καθόλου απ'τη JavaScript, περνάνε με κανονικό postback. Απλώς κάνω raise ένα custom event, δεν ήταν καθόλου σκοπός μου να μπλεχτώ στα χωράφια του AJAX (Δεν είμαστε τόσο trendy ακόμη εδώ :D ).

    Απλά μου φάνηκε ενδιαφέρον το ζήτημα, κι είπα να το μοιραστώ :)
    Angel
    O:]
  •  27-09-2005, 16:28 5763 σε απάντηση της 5756

    Απ: Client-side scripting που κάνει raise server-side events

    Όχι, καλά έκανες και το μοιράστηκες, υποδειγματικά καλά... Yes [Y]

     

    George J.

     

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems