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

 

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

ASP.NET Event Handling

Îåêßíçóå áðü ôï ìÝëïò evliatsas. Τελευταία δημοσίευση από το μέλος Νατάσα Μανουσοπούλου στις 11-11-2006, 22:34. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-11-2006, 14:39 20088

    ASP.NET Event Handling

    Έχω την εξής απορία,

     

    Υπάρχει δυνατότητα να γίνει fired ένα control event χωρίς να γίνει PostBack στον Server??

    π.χ. Υποθετικό Σενάριο

    Έχουμε ένα DropDownList Control και ένα Label. Θέλουμε όταν αλλάζει το SelectedIndex του DropDownList να αλλάζει και το Text Property του Label.

    Για παράδειγμα να επιλέγεις ένα προϊόν και να σου δίνει δίπλα την τιμή.

    Άν δώσουμε στο DropDownList AutoPostBack=true και δημιουργήσουμε τον OnSelectedIndexChanged event handler, τότε όλα είναι στρωτά και εύκολα.

    Άν όμως επιθυμούμε να έχουμε AutoPostBack=false επειδή έχουμε 30 DropDownList σε μία φόρμα και δεν θέλουμε να "κατεβαίνει" η σελίδα για κάθε μία επιλογή???

     

     

  •  09-11-2006, 14:54 20094 σε απάντηση της 20088

    Απ: ASP.NET Event Handling

    Ολα ξεκινούν απο το σχεδιασμό του ASP.NET.

    Τι κάνει το event handling σε ένα τέτοιο σύστημα όπως το asp.net που έχει χτιστεί πάνω από ένα stateless, http περιβάλλον; Ελατε, ελατε...μπραβο! Στελνει πίσω στο server κάποια πραγματάκια και ο server λεει "ω, να ενα event!". :)

    Με ποιόν τρόπο κάνει αυτό το ωραίο κόλπο; Μα με τον τρόπο που ξέρει το asp.net. Postback.

    Τα events (server-side) είναι εφεύρεση του ASP.NET για να κάνει το χειρισμό των web forms να μοιάζει με το χειρισμό των windows forms (κάτι στο οποίο ήμουν πάντα αντίθετος αλλά φαίνεται οτι δεν με άκουσε κανείς :) )

    Αρα λοιπόν εναλλακτικός τρόπος για να κάνουμε client side event handling είναι να αξιοποιήσουμε τα events των primitive html controls που βρίσκονται κάτω από τα "σύνθετα" controls του ASP.NET με client-side javascript. Κάτω από το dropdownlist κρύβεται ένα combobox. Πιάνοντας το event onChange του combobox, μπορούμε να αλλάξουμε την τιμή του label.

    Δεν επεκτείνομαι λόγω έλλειψης χρόνου. Να πω οτι εδώ παίρνει "νερό" η κουβέντα, μια και το AJAX κομμάτι του πράγματος ίσως μας δίνει λύσεις σε αυτά τα προβλήματα κάνοντας επιλεκτικές κλήσεις ή χειριζόμενο αυτό τα html control events. Δεν το γνωρίζω όμως, οπότε κάποιος άλλος συνάδελφος ίσως θα μπορούσε να μας διαφωτίσει.

    Η απάντησή μου σαφώς δεν είναι ολοκληρωμένη, αν δεν συμπληρώσει κάποιος άλλος συνάδελφος θα επανέλθω.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  10-11-2006, 11:16 20134 σε απάντηση της 20088

    Απ: ASP.NET Event Handling

    Αν η σελίδα σου κάνει Implement το ICallbackEventHandler, μπορείς με javascript να καλέσεις ένα callback στον server, και μετά πάλι με javascript να βάλεις στο textbox αυτό που θα επιστρέψει server.

    Πιο συγκεκριμένα:

    Στην aspx, χρειάζεσαι αυτά.

    <head runat="server">

       <title>Untitled Page</title>

       <script language="javascript">

          function changeProduct() {

             var arg = document.getElementById('ddlProducts').value;

             <%=callback %>

          }

          function CallbackResult(result, context){

             document.getElementById("lblProduct").innerText = result;

          }

          function CallbackResultError(result, context){

             alert(result);

          }

    </script>

    </head>

    <body>

    <form id="form1" runat="server">

    <div>

       <asp:DropDownList ID="ddlProduct" AutoPostBack="false" onChange="changeProduct()" runat="server">

          <asp:ListItem Value="prod1" Text="prod1" />

          <asp:ListItem Value="prod2" Text="prod2" />

          <asp:ListItem Value="prod3" Text="prod3" />

          <asp:ListItem Value="prod4" Text="prod4" />

       </asp:DropDownList>

       <br /><br />

       <asp:Label ID="lblProduct" runat="server" />

    </div>

    </form>

    </body>


    Το dropdownlist έχει autopostback false και όταν ο χρήστης επιλέξει κάποιο item τρέχει το javascript event onChange το οποίο κάνει το callback στο server.

    Η CallbackResult παίρνει το αποτέλεσμα που επιστρέφεται από τον server και στη συγκεκριμένη περίπτωση το βάζει στο label

    H CallbackResultError κάνει alert κάποιο error που μπορεί να έχει συμβεί.

    Η aspx.vb πρέπει να είναι κάπως έτσι:

    Inherits System.Web.UI.Page

    Implements ICallbackEventHandler

    Protected callback As String

    Private sSelectedProduct As String

     

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

       If Not Page.IsCallback Then

          callback = Page.ClientScript.GetCallbackEventReference(Me, "arg", "CallbackResult", "", "CallbackResultError", False)

       End If

    End Sub

    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult

       Return sSelectedProduct & ":" & 34

    End Function

    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements    System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

       ' Find the value of the selected product

       sSelectedProduct = eventArgument

    End Sub


    Κάνεις implement to ICallbackEventHandler.

    Έχεις μια protected (για να τη βλέπει και η aspx) μεταβλητή τύπου string η οποία έχει reference στο callback. Στη δεύτερη παράμετρο (arg) , μπορείς να περάσεις κάτι μέσω javascript. Εδώ χρειάζεται να περάσεις το selecteditem του ddl γιατί αλλίως δεν μπορείς να το δεις στo code-behind καθώς δεν έχει γίνει postback.

    Η GetCallbackResult επιστρέφει ένα string (που μετά το πιάνει η javascript CallbackResult).

    H RaiseCallbackEvent κάνει raise το event όπου μπορείς να τρέξεις ότι κώδικα θέλεις για να πάρεις την τιμή του product. Βέβαια αυτό μπορεί να γίνει και στην GetCallbackResult.

    Αν θέλεις να περάσεις ή/και να επιστρέψεις πιο πολλά πράγματα και επειδή ο server παίρνει string και επιστρέφει string, τότε το xml είναι μια καλή λύση. Με άλλα λόγια, αν θέλεις πχ να στείλεις στον server περισσότερα από ένα πράγματα, όπως 2 επιλεγμένα items από 2 dropdownlists, μπορείς να τα στείλεις σε xml μορφή, και μετά στη vb να τα παρσάρεις. Ομοίως και στην περίπτωση που ο server πρέπει να επιστρέψει πολλά. Πάλι μπορείς να τα επιστρέψεις σε xml μορφή και μέσα στην javascript συνάρτηση που παίρνει το αποτέλεσμα, να φορτώσεις το result σε ένα xmldoc.
    Έχω κάνει κάτι παρόμοιο, οπότε αν χρειαστείς...

    Ένα σοβαρό μειονεκτήμα αυτής της μεθόδου είναι ότι δεν φαίνεται κάπου ότι κάτι γίνεται στο server, οπότε πρέπει κάπως να ειδοποιείται ο χρήστης.

    Πχ, μπορείς να έχει ένα div και πριν κάνεις το callback να γράφεις στο innerHtml του κάτι του στυλ 'Παρακαλώ περιμένετε...'

    Όλα τα παραπάνω λογικά λύνονται με το implementation της Microsoft για το AJAX....αλλά δεν το έχω ψάξει πολύ για να πω περισσότερα...

    Ισίδωρος

  •  11-11-2006, 15:36 20194 σε απάντηση της 20134

    Απ: ASP.NET Event Handling

    Ευχαριστώ πολύ Ισίδωρε.

    Μου έδωσες μία πολύ καλή βάση για προβληματισμό και μελέτη.

    Σημειώνω το topic ώς επιλυμένο, αλλά όποιος έχει υλοποιήσει κάποια άλλη προσέγγιση, please don't hesitate to share...
  •  11-11-2006, 22:34 20211 σε απάντηση της 20194

    Απ: ASP.NET Event Handling

    Με το Microsoft AJAX  μπορείς απλά να τυλίξεις το κομμάτι της σελίδας σου που θέλεις να κάνει το partial refresh σε ένα UpdatePanel και όλα μετά να γίνονται automagically. Βέβαια στο παρασκήνιο θα γίνει ένα postback, αλλά η επεξεργασία στο server θα αφορά το κομμάτι που περιέχει το UpdatePanel μόνο και θα γίνει αντιστοίχως μόνο αυτό redraw στον client.
    Νατάσα Μανουσοπούλου
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems