Hola como hemos hablado anteriormente, una de las principales necesidades de un desarrollador Web es poder lograr comunicaciones asíncronas con el servidor de tal forma que sea posible evitar postbacks, lo cual mejora la experiencia de usuario y los tiempos de respuesta. Pues bien en el camino arduo y tortuoso, para este tipo de llamados en ASP.NET poseemos un objeto que brinda mucho poder y es el objeto ScriptManager, que en pocas palabras nos permite mejorar y extender el funcionalidad en el lado cliente con Javascript.

Para poder hacer este tipo de llamados es necesario crear un WebMethod, el que nos permite crear un comportamiento ajax de forma tal que mediante una invocación no sea necesario pasar por todo el ciclo de vida de una página en ASP.NET de tal forma necesitamos agregar al form el objeto ScriptManager, existente en el Toolbox de Visual Studio, tal cual como vemos en pantalla.

En dicho objeto debemos establecer la propiedad EnablePageMethods en true, así cuando la página sea ejecutada el ScriptManager se encargará de crear toda la funcionalidad necesaria para realizar el llamado asíncrono a los PageMethods existentes y accesibles de forma estática. Nos restará poner por ejemplo en nuestro código las siguiente lineas que serán las encargadas de consumir y procesar el resultado del servicio “estático” que se creó en la Página Web.

ASPX


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormWebMethods.aspx.cs" Inherits="PageWebMethodsScriptManager.WebFormWebMethods" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" language="javascript">
        function LlamarWebMethod() {
            PageMethods.GetPaises(Result);
            return false;
        }
        function Result(results) {
            var msgDatos = new String();
            msgDatos = "Paises:<br/>";
            for (var i = 0; i < results.length; i++) {
                msgDatos += i + ". " + results[i] + "<br/>";
            }
            DivResultados.innerHTML = msgDatos;
        }
    </script>
</head>
<body>
    
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    <div>
        <asp:Button ID="BtCallWebMethod" runat="server" Text="Llamar Web Method" 
        OnClientClick="return LlamarWebMethod();" />
    </div>
    <div id="DivResultados"></div>
    </form>
</body>
</html>

Code behind C# del ejemplo.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;

namespace PageWebMethodsScriptManager
{
    public partial class WebFormWebMethods : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        //Este será nuestro Servicio, declarado de forma simple, evitando complejidad y la creación de un            
        //WebService cuando no es necesario.
        [WebMethod]
        public static List<string> GetPaises()
        {
            List<string> listPaises = new List<string>();
            listPaises.Add("Colombia");
            listPaises.Add("Perú");
            listPaises.Add("Argentina");
            listPaises.Add("Brazil");
            listPaises.Add("Uruguay"); 
            listPaises.Add("Chile");
            listPaises.Add("Venezuela");
            return listPaises;
        }
    }
}

Ok así podemos mejorar nuestras aplicaciones y de una forma sencilla se hará dicha implementación que en muchas ocasiones nos causa tantos dolores de cabeza.