Eventos de servidor 2
Si bien es cierto que los eventos de servidor predefinidos son los más comunes, puede darse
el caso que queramos hacer algo diferente. Por ejemplo manejar un evento no-predefinido, o
redefinir un evento predefinido del que queremos unos datos diferentes.
Para este caso tenemos el evento
ServerEvent. Para hacerlo funcionar, deberemos seguir los
siguientes pasos:
1.- Javascript
Debemos añadir un javascript y usar la clase javascript 'serverEvent' para mandar la información a servidor.
Como vemos en el ejemplo, un modo sencillo de crear el javascript es usando
addListener.
En los ejemplos vemos que usar la clase 'serverEvent' es muy sencillo, pues no hay más que inicializarla
con el nombre que queramos darle al evento (eventName) y el identificador del mapa (GMap_Id) en el caso de que haya más de un mapa en una misma página e ir añadiéndole tantos argumentos como queramos.
Finalmente hay que llamar a la función 'send()' y la información se envía a servidor.
2.- Servidor
En el servidor, debemos manejar el evento ServerEvent, tal y como se hace con el resto de eventos.
Ahí dispondremos de
GAjaxServerEventOtherArgs en la que podemos encontrar 2 propiedades (además
de las comunes "who" y "point"):
-
eventName: string que contiene el nombre del evento que nosotros mismo hemos definido.
Es muy útil para, como en el ejemplo, distinguir entre varios eventos diferentes
-
eventArgs: es un array de string que contiene todos los argumentos que hemos
añadido en javascript.
En el ejemplo vemos como definimos dos eventos: "Click" y "InfoWindowClose".
El primero maneja
el evento click del mapa; ya hemos visto que este evento era uno de los predefinidos, pero
aquí hemos añadido un argumento que no teníamos antes: el tamaño del mapa.
En cuanto a "InfoWindowClose", maneja un evento de los no-predefinidos. Vemos pues que
podemos manejar cualquier evento que produzca el mapa, los markers, o lo que sea.
Code.aspx
<cc1:GMap ID="GMap1" runat="server" enableServerEvents="true"
OnServerEvent="GMap1_ServerEvent" />
Code.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GMap1.addListener(new GListener(GMap1.GMap_Id, GListener.Event.click,
string.Format(@"
function(overlay, point)
{{
if (!point) return;
var ev = new serverEvent('Click', {0});
ev.addArg({0}.getSize().width);
ev.addArg({0}.getSize().height);
ev.addArg(point.lat());
ev.addArg(point.lng());
ev.send();
}}
", GMap1.GMap_Id)));
GMap1.addListener(new GListener(GMap1.GMap_Id, GListener.Event.infowindowclose,
string.Format(@"
function()
{{
var ev = new serverEvent('InfoWindowClose', {0});
ev.addArg('My Argument');
ev.send();
}}
", GMap1.GMap_Id)));
}
}
protected string GMap1_ServerEvent(object s, GAjaxServerEventOtherArgs e)
{
string js = string.Empty;
switch (e.eventName)
{
case "Click":
GLatLng latlng = new GLatLng(
Convert.ToDouble(e.eventArgs[2], new System.Globalization.CultureInfo("en-US", false)),
Convert.ToDouble(e.eventArgs[3], new System.Globalization.CultureInfo("en-US", false)));
GInfoWindow window = new GInfoWindow(latlng, string.Format("Window Size (px): ({0},{1}). Close Me.",
e.eventArgs[0], e.eventArgs[1]));
js = window.ToString(e.who);
break;
case "InfoWindowClose":
js = string.Format
("alert('{0}: {1} - {2} - {3}')", e.eventName, e.point, e.eventArgs[0], DateTime.Now);
break;
}
return js;
}