Llamar función de C# des de JavaScript con AjaxPro

Des de hace ya algún tiempo, estoy utilizando AjaxPro para agilizar la mayoría de mis procesos. Por si no la conocíais, esta librería ha sido desarrollada por Michael Schwarz conocido MVP de ASP. net.

 

Una de las cosas que más utilizo es llamar métodos de C#/VB.net des de JavaScript. Todos sabemos que JavaScript no sobrecarga el servidor y que es mucho mejor validar datos en cliente que en servidor. En casi todas las aplicaciones que hacemos, debemos hacer validaciones de todo tipo por ejemplo, hacer un campo obligatorio en función de si otro ha sido llenado por el cliente o no y en función de eso ejecutar una sobrecarga de un método del code behind u otro.

 

Pues bien, para hacer esto posible deberíamos ser capaces de llamar a una sobrecarga de un método C# des de nuestro código cliente pero sin tener que volver a sobrecargar la pagina.

 

Antes de nada, deberemos descargarnos la librería AjaxPro.2.dll de AjaxPro. Una vez descargada, creamos un nuevo proyecto Web y nos situamos en el web.config, debemos añadir un manejador para la librería:

 

<httpHandlers>

<add verb=POST,GET path=ajaxpro/*.ashx type=AjaxPro.AjaxHandlerFactory, AjaxPro.2/>

</httpHandlers>

 

Tener cuidado ya que <httpHandlers> ya aparece en el web.config, así que únicamente nos interesaría ubicar el <add… dentro de las etiquetas mencionadas.

 

El siguiente paso, es agregar la referencia de AjaxPro.2.dll en nuestro proyecto e indicar su uso en nuestro code behind:

 

using AjaxPro;

 

Para que nos funcione esta librería en nuestro proyecto, en el load de la página, deberemos indicar lo siguiente:

 

protected void Page_Load(object sender, EventArgs e)

{

Utility.RegisterTypeForAjax(typeof(_Default));

}

 

Esta función, es la encargada de preparar la página en la que estamos para que se pueda enlazar el código cliente con el código servidor.

 

Ahora lo que debemos hacer, es crear un método en el code behind de la siguiente forma:

 

[AjaxMethod]

public string MuestraMensaje()

{

return “¡Hola des del servidor!”;

}

 

Como veis, la única diferencia es que se ha puesto un atributo de la librería en el método. Esto nos indica que este método podrá ser llamado des de JavaScript. Ahora des del código de cliente, crearemos lo siguiente:

 

<script type=”text/javascript”>

        function muestraTexto()

        {

            _Default.MuestraMensaje(muestraTexto_callback);

        }

 

        function muestraTexto_callback(txt)

        {

            alert(txt.value);

        }

</script>

 

Esto nos hace una llamada a nuestro método, ya que lo tiene implementado la propia librería usando objetos MSXML. Se tiene que plantear de la forma siguiente, un método que es el llamante al cuál se le pasa el método de respuesta; el método de respuesta recibe el objeto que ha devuelto el método de code behind y  allí podremos trabajar con el valor devuelto.

 

Este es un ejemplo de un método que nos devuelve un texto y queremos trabajar con él, pero no necesariamente debe ser así ya que podemos llamar al método de C# sin recibir nada, con o sin parámetros.

 

Por ejemplo, podríamos recoger los datos de un formulario, validarlos y si es correcto llamar a un método de C# que recibe los valores necesarios y que nos guarde la información en la base de datos. Opcionalmente, nos podría devolver un mensaje de texto que le mostraríamos al usuario para informar de si todo ha ido correctamente o no. Nos da bastante libertad en el momento de trabajar.

 

Por el momento, os dejo esto J! Más adelante más cosas!

 

Go…play!!!

29 Respuestas a Llamar función de C# des de JavaScript con AjaxPro

  1. Excelente articulo y muy clara la idea, justo lo que estaba buscando.

    gracias por tu aporte.

  2. molt interessant, Ajax Pro és una gran eina – En alguns aspectes fa coses que el AJAX Framework de Microsoft no fa…

  3. Hola..exelente articulo..tengo una pregunta…con esta libreria no es necesario crear el objeto XmlHttpRequestObject…???

  4. Hola Manuel,

    No es necesario crear el objeto manejador de ajax porque ya lo crea la libreria. Esta libreria es solo una forma facil de usar AJAX pero por detras crea y usa este objeto.

    Si te interesa, puedes ver los fuentes en la misma pagina web, puedes echarles un vistazo ya que son muy faciles de entender.

    Cualquier cosa, ya sabes!
    Un saludo!

  5. hola exelente articulo pero sabes sigo al pie de la letra tu tutorial .pero a nivel de javascript no me reconoce la clase que registre en page load.
    ejemplo:

    mports AjaxPro
    Partial Public Class AJAX
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    AjaxPro.Utility.RegisterTypeForAjax(GetType(AJAX))

    End Sub
    _
    Public Function MuestraMensaje() As String

    System.Threading.Thread.Sleep(1000)
    Return “¡Hola desde del servidor!”
    End Function

    End Class

    depues la purebo y me tira un error javascript que el objeto AJAX no existe

  6. Hola Felipe,

    Asegurate que en el aspx, en el Inherit del aspx el nombre del namespace sea el mismo que el tipo que registras.

    Ya me dices!
    Saludos!

  7. Por cierto, veo en el codigo que te falta indicar [AjaxMethod] en tu función MuestraMensaje().

  8. Que tal, gracias por el ejemplo, ayuda a toda la comunidad de programadores.

    Ya segui el ejemplo y otros ejemplos de la pagina oficial y siempre me regresa el mensaje:
    Object doesn’t support this property or method

    este es mi codigo:
    [AjaxMethod]
    protected void mensajeCambio()
    {
    this.cambioLabel.Text = “Existen cambios sin guardar cambio mensaje”;
    this.cambioUpdatePanel.Update();
    }

    y en el java script:

    function muestraTexto()
    {
    compras.mensajeCambio();
    }

    No he sabido que sucede,espero me ayuden

  9. Hola, creo que tu ejemplo es muy ilustrativo, pero yo manejo MasterPage y asi como lo tienes no me funciona, no reconoce el nombre de la pagina ejemplo: Utility.RegisterTypeForAjax( typeof( MiPagina) );
    esto en el Page_Load de mi form

    en la funcion de javascript hago lo que indicas:
    MiPagina.MuestraMensaje(muestraTexto_callback);

    pero no funciona, creo que falla por el MasterPage, ojalá puedas eyudarme con un ejemplo que utilize el masterpage

    Saludos

  10. Hola Jose Antonio,

    Gracias por los comentarios. Deberias registrar como typeof(TuMasterPage);

    Como las paginas hijas estartán dentro de un contentPlaceHolder y este dentro de la MasterPage, el enlaze tiene que ser automático.

    Un saludo!

  11. No te funciona porque la funcionalida de Ajax Pro esta daba para manipular informacion/Sessiones no Controles, en este caso debes retornar el Texto del Mensaje “Existen cambios sin guardar cambio mensaje”;

    y Establecerlo en el control utilizando javascrip

    Algo asi como:

    [AjaxMethod]
    protected string mensajeCambio()
    {
    return “Existen cambios sin guardar cambio mensaje”;
    }

    javascript
    document.getElementbyId(“cambioLabel”).value=compras.mensajeCambio().value;

  12. Ya hice todo correctamente tal como lo tienes en el ejemplo pero me manda un error me dice que _Default no esta definido. Te agradeceria si me dijeras que pasa. estoy ocupando el Visual Web Developer express 2008
    Saludos.

  13. Ya hice todo lo del ejemplo pero me lanza un error me dice que _Default no esta definido. Me podrias decir que es lo q pasa

    estoy ocupando el visual web developer 2008
    Saludos.

  14. Buen día. Implementado tu ejemplo sobre la comunicación de un método en ASP.NET y JavaScript me manda un error en la declaración del evento “onkeydown” del control “Input” tipo “Text”. Evento donde mando invocar el método del lado de ASP.NET, el error es el siguiente:
    Error en tiempo de ejecución de Microsoft JScript: Se esperaba un objeto

    Mi proyecto se maneja por medio de una MasterPage y maneje el registro de la libreria desde el evento load de la MasterPage.
    Espero me puedas ilustrar sobre el problema. Gracias.

  15. Hola.

    Estoy haciendo este ejemplo de una manera diferente, mando a llamar el resultado de manera directa y lo hace perfecto, pero como en unos 30 o 40 segundos de que ya regreso o sea ya termino de hacer lo que tenia que hacer en la pantalla,marca un error de tiempo de ejecucion,

    alguien puede ayudarme.
    dsPadre = Generales_MenuAjax.RecuperaDatos(sql).value

  16. Hola a todos, quisiera hacerles una consulta, quiero llamar un metodo en un formuario que tiene incrustado un webbrowser, ese webbrowser ejecuta un javascript y quiero que llame a ma funcion, o metodo del formulario. Alguien sabe como hacerlo ?

  17. Buenas tardes, estoy teniendo un error en el archivo prototype.js, especificamente en la funcion clear: function(), cuando se hace la asignacion this.length = 0 me da un erro, alguien ha tenido ese problema?

  18. Hola!! apenas comienzo con ajax y tengo las siguientes inquietudes.
    tengo un sitio web hecho en VB.net y mi pregunta es este lo puedo integrar con AjaxPro o solo tiene q ser con C#.
    si se puede alguien sabe donde puedo encontrar algun ejemplo, pq la verdad todos los ejemplos que he visto son con C#, muchas gracias

  19. Hola!!

    Muy buen articulo!!, me sirvio bastante, es muy descriptivo y me funciono super bien =)

    Gracias x la aportacion ;)

  20. Pues si me funciona cuando estoy en desarrollo pero cuando publico mi pagina me dice que no me reconoce “ConfFactElec”

    en el *.cs

    [AjaxPro.AjaxNamespace("ConfFactElec")]

    public partial class ConfiguracionFacturaElectronica : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
    AjaxPro.Utility.RegisterTypeForAjax(typeof(ConfiguracionFacturaElectronica)); ……

    [AjaxPro.AjaxMethod]
    public static string MuestraMensaje(string archivo) { …
    //////

    en javascript

    function fileUploaded(sender, args) {
    var archivo = args.get_fileName();
    SalirSucursalClick();
    ConfFactElec.MuestraMensaje(archivo, muestraTexto_callback);

    }

    function muestraTexto_callback(result) {
    ….
    //

    en el web config tengo

    funciona bien hasta que lo publico.. ya no me reconoce nada
    algo que me halla faltado?

  21. lo del web config

  22. location path=”ajaxpro”
    system.web
    httpHandlers
    add verb=”*” path=”*.ashx” type=”AjaxPro.AjaxHandlerFactory, AjaxPro.2″/
    /httpHandlers
    /system.web
    /location

  23. Hola quiero saber como se puede mandar a llamar un método por medio de un link a href si alguien sabe ayudeme por favor

  24. estoy usando asp.net en c# cualquier comentario sera de mucha ayuda

  25. Hola, muy bueno el articulo. El código me funcionó de lujo, pero al llegar a la funcion en c#, no me permite utilizar los controles de la página, ya que me llegan a null.

    Alguna idea???

    Muchas garcias.

  26. Hola al utilizar ajax pro he seguido todo a pie de la letra y al momento de llegar al script js me dice que el objeto no esta definido refiriendose al namespace del ajax, alguien puede decirme que me hace falta, gracias

  27. tengo problemas al publicar el sitio

  28. todo funciona muy bn al estar desarrollando pero al publicar no funciona ninguna llama a metodos ajax.. ayuda por favor´

  29. Saludos, creo tengo el mismo problema de varios cuando llega al javascript me dice que el nombre *** no esta definido haciendo referencia al nombre de la clase declarada, saludos y gracias por el aporte

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s