Eines der Features in ASP.Net ist die Möglichkeit, serverseitigen Code vom clientseitigen Code ohne Postback aufzurufen, wobei ein so genannter Client-Callback verwendet wird. Es gibt ein paar kleinere Vorbehalte, die ich bisher gefunden habe: -
- es verwendet XmlHttp, das ist IE nur im Moment. Firefox und andere Browser haben eine Alternative, aber die Callbacks verwenden dies nur.
- der einzige Typ, den Sie vom Server zurückgeben kann, ist eine Zeichenfolge (aber wir können um das bekommen von Serialisierung, wenn nötig)
Das Beispiel, das ich verwendet habe, ist, wo ich zwei miteinander verbundene Textboxen, die sein müssen synchron gehalten. Wenn das Feld ClientID geändert wird, sollte das Feld Clientname den Namen des Clients anzeigen, der diese ID hat, und umgekehrt.
mit dieser Funktionalität zu starten, Ihr gewährleisten Code-Behind implementiert die ICallbackEventHandler Schnittstelle: -
public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler
Als nächstes melde ich meine Callback-Methoden in der Page_Load-Methode in meinem aspx.cs: -
// Set up client callbacks. These allow client-side scripts to call
// server-side functions and retrieve the results. Its a string-only
// return I'm afraid, limited by the ICallbackEventHandler method signatures
txtClientID.Attributes.Add("onchange", "GetClientNameById('id|' + this.value, 'id');");
string callBackClientID = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientNameCallback", "context", "ClientNameCallbackError", true);
string clientIDfunction = "function GetClientNameById(arg,context) { " + callBackClientID + "; }";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientNameById", clientIDfunction, true);
txtClientName.Attributes.Add("onchange", "GetClientIdByName('name|' + this.value, 'name');");
string callBackClientName = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientIdCallback", "context", "ClientIdCallbackError", true);
string clientNamefunction = "function GetClientIdByName(arg, context) { " + callBackClientName + "; }";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientIdByName", clientNamefunction, true);
Dies registriert die Serverfunktionen mit der Seite und hängt sie an die Callback-Methoden des Clients an - diese Callback-Methoden sind grundlegende Platzhalter, die nichts anderes tun, als dem Server irgendwo den String zurückzugeben. Also auf der aspx Seite selbst: -
<script type="text/javascript">
function ClientNameCallback(result, context)
{
//sorry about the hardcoded element name...
if(result != "")
document.getElementById('ctl00_ContentPlaceHolder1_txtClientName').setAttribute('value',result);
}
function ClientIdCallback(result,context)
{
//sorry about the hardcoded element name...
if(result != "")
document.getElementById('ctl00_ContentPlaceHolder1_txtClientID').setAttribute('value',result);
}
function ClientNameCallbackError(result, context)
{
//Not sure what error is likely to arise at this point, but...
alert('Error in client name callback function - please say that to eSolutions!');
}
function ClientIdCallbackError(result, context)
{
//Not sure what error is likely to arise at this point, but...
alert('Error in client id callback function - please say that to eSolutions!');
}
</script>
Schließlich implementieren wir die erforderliche ICallbackEventHandler, die die serverseitige Verarbeitung enthält wollen wir durchführen: -
string ICallbackEventHandler.GetCallbackResult()
{
return callbackReturnValue;
}
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
// eventArgument should be in format field|value,
// e.g., "id|30102" or "name|test client"
// This is because of the "single string" limitations
// of the callback interface
if(eventArgument.StartsWith("name"))
{
//....do lookup to get the id based on the name, from an array or database, or whatever
callbackReturnValue = <string we want to pass back to client-side
}
else if(eventArgument.StartsWith("id"))
usw. usw.
das funktioniert gut. Vielen Dank. Ich habe eine separate Seite erstellt, die genau das zurückgibt, wonach ich suche. Vielen Dank.Obwohl das nach einer ineffizienten Methode aussieht, nach dem, was ich von den anderen Antworten gelesen habe. Vielen Dank! –
Ja, idealerweise würden Sie Ihre Seite in ASP Markup usw. erstellen, das war nur ein kurzes Beispiel. Auch wie andere gesagt haben, das ASP.NET AJAX-Handling ist wirklich anständig und tot einfach (Sie brauchen nicht einmal eine separate Seite oder separaten Code) - oder jQuery ist ebenso brillant für die Client-Seite, aber wie Sie das gesagt haben war eine Lernübung. –