Одной из функций ASP.Net является возможность вызова кода на стороне сервера из кода на стороне клиента без обратной передачи, используя так называемый обратный вызов клиента.Однако я обнаружил несколько незначительных предостережений: -
- , он использует XmlHttp, который является IE только на данный момент.У Firefox и других браузеров есть альтернатива, но обратные вызовы используют только это.
- единственный тип, который вы можете вернуть с сервера - это строка (но мы можем обойти это, сериализовав при необходимости)
В примере, который я использовал, у меня есть два связанных текстовых поля, которые нужно синхронизировать.Если поле ClientID изменено, в поле ClientName должно отображаться имя клиента с таким идентификатором, и наоборот.
Чтобы начать использовать эту функцию, убедитесь, что ваш программный код реализует интерфейс ICallbackEventHandler: -
public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler
Далее я регистрирую свои методы обратного вызова в методе Page_Load в моем 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);
Это регистрирует функции сервера на странице и подключает их кметоды обратного вызова клиента - эти методы обратного вызова являются основными заполнителями, которые ничего не делают, но дают серверу куда-то, куда нужно вернуть свою строкуИтак, на самой странице aspx: -
<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>
Наконец, мы реализуем требуемый ICallbackEventHandler, который содержит обработку на стороне сервера, которую мы хотим выполнить: -
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"))
и т. Д.и т.д.