Αν η σελίδα σου κάνει 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....αλλά δεν το έχω ψάξει πολύ για να πω περισσότερα...
Ισίδωρος