Provocar un postback desde JavaScript con ASP.NET

Eva Higueras | 27 de enero de 2009 | 12 comentarios

Más sobre: ASP.NET, JavaScript | Tags: , , , , , , , , , ,

En varias ocasiones, trabajando con ASP.NET, nos hemos encontrado con la necesidad de lanzar un postback desde el cliente mediante una llamada realizada en JavaScript. Para esto, existe una función, __doPostBack, pero no funciona correctamente cuando hacemos la llamada desde un JavaScript colocado en un UserControl o si utilizamos una MasterPage. Después de mucho investigar, hemos averiguado cómo funciona realmente esta función, y qué debemos hacer para que funcione con UserControl y MasterPages. Además, hemos trabajado también con una alternativa para provocar un postback desde JavaScript.

Opción 1: Cómo utilizar __doPostBack(eventTarget, eventArgument)

Esta función puede llamarse desde código JavaScript y hace una llamada al servidor indicándole el control que la provoca, y los argumentos asociados a dicha llamada.

Los parámetros que se pueden pasar son:

  • eventTarget: objeto que provoca el postback.Si queremos que el postback que estamos forzando, llame al evento de algún objeto en particular, indicaremos como primer parámetro el identificador de este objeto. Este identificador será:
    • en caso de que estemos en un control de tipo Page, el clientId del objeto.
    • en caso de que estemos en un control de tipo UserControl, o que estemos utilizando MasterPages, necesitaremos el UniqueId del control, pero modificado.

    La modificación del identificador es necesaria ya que cuando ASP nos devuelve el ClientID, utiliza como separador el carácter ‘_’, y para que la llamada al servidor funcione correctamente, necesitamos que se utilice como separador el carácter ‘$’. Para ello, podemos utilizar la siguiente función:

    public static string UniqueIDWithDollars(Control ctrl)
    {
       string sId = ctrl.UniqueID;
       if (sId == null)
       {
          return null;
       }
       if (sId.IndexOf(':') >= 0)
       {
          return sId.Replace(':', '$');
       }
       return sId;
    }

    Y en la llamada al postback, escribiremos:

    __doPostBack('','');
  • eventArgument: argumentos que se le pueden pasar a la función.
    Estos parámetros se recibirán en el método asociado al postback del control indicado de manera que el objeto en eventTarget se recibirá como sender, y el argumento pasado en eventArgument se recibirá en e:

    protected void control_postback(object sender, EventArgs e)

Existe una alternativa al uso de la función UniqueIDWithDollars. Puedes consultar información detallada al respecto en “uso de la función GetPostBackEventReference“.

Referencia (en Inglés)

Opción 2: Utilizar el evento del cliente

Es posible invocar a métodos tales como el clic de un botón desde javascript utilizando simplemente el método clic del propio botón. Necesitaremos utilizar el evento de cliente asociado al evento del servidor que necesitamos disparar.

var boton = document.getElementById('');
boton.click();

Más sobre: ASP.NET, JavaScript | Tags: , , , , , , , , , ,

Comentarios

12 comentarios a “Provocar un postback desde JavaScript con ASP.NET”

  1. Fernando el 19 agosto, 2009 17:32

    Hola, Con la opción 2 logré forzar un evento clic ASP desde Javascript, eso si con una salvedad… tuve que buscar por ID que se generaba con el HTML no con el ID que yo le había indicado en el ASPX, revisando con Firebug 1.4.2(Firefox) pude percatarme que ese era mi problema, pues en ejecucion el control cambiaba de nombre:

    El Control es un ImageButton llamado ‘btAlluser’

    NO FUNCIONA

    var boton = document.getElementById(‘<%= boton.btAlluser %>’);
    boton.click();

    SI FUNCIONA

    var boton = document.getElementById(‘_ctl0_btAlluser’);
    boton.click();

    MUCHAS GRACIAS POR EL ARTICULO.

  2. Javi el 15 febrero, 2010 11:58

    Hola Fernando,

    No tienes que poner “’’”
    en tu caso deberías haber usado
    “’’”. Esto se ejecuta desde el servidor al cargar la página y lo reemplaza por el valor de la propiedad ClientID, que es el ID real en el cliente (’_ctl0_btAlluser’).

    De esta forma si usas el control dentro de un Control de usuario, por ejemplo, la pagina cogera automáticamente ese ID, y no tendrías que estar modificando en cada emplazamiento, ya que el ID del cliente depende siempre de sus contenedores superiores.

    Saludos.

  3. Hernán el 26 febrero, 2010 21:04

    Perdón por la pregunta.
    La función UniqueIDWithDollars en que está escrito? en javascript o C#?
    Disculpas por mi ignorancia.
    Muy bueno el artículo.

    Saludos,

  4. Eva Higueras el 15 marzo, 2010 10:01

    La función UniqueIDWithDollars está escrita en C#.

  5. 00Ceballos el 4 junio, 2010 2:57

    Buenas tardes, una duda, yo estoy manejando controles de usuario, al momento de cargarlos dinamicamente, tengo que apretar algun boton del control para poder empezar a usarlo bien(osea un postback en el control), el segundo caso que ustedes exponen me parece bien solo que no se en que momento llamarlo, por que no me ha estado funcionando, en que momento mando llamar ese script?? saludos

  6. Eva Higueras el 10 junio, 2010 10:43

    Hola,
    Si lo que necesitas es lanzar un postback al cargar un control de manera dinámica, una posible solución es incluir, junto con tu control dinámico, un bloque de javascript, de manera que al cargar la página ejecute la llamada al botón. Para ello, te recomendaría que, sobretodo si estás utilizando AJAX, utilices el ScriptManager para registrar este script, ya que si utilizas el objeto Page y no haces una recarga completa de la página, el script no se registrará correctamente.
    Espero que te sirva de ayuda.
    Un saludo.

  7. marcos el 18 septiembre, 2010 10:48

    interesante !!!

  8. Lizbeth Novoa el 7 septiembre, 2011 22:41

    Hola..! Mi funcion __dopostback llama a una funcion que almacena en una base de datos y genera una respuesta, quiero mostrar esa respuesta en pantalla mediante un alert pero no logra hacerlo xq al parecer cuando hace el alert aun no termina d ejecutarse el __dopostback, alguien podria decirme como hacer para que el alert pueda mostrarse

  9. Ricardo el 24 enero, 2012 15:26

    Olá, meu nome é Ricardo R. Lopes, moro no Brasil e gostaria de parabenizar pelo artigo que é de muito útil.

    Parabéns

  10. cesar el 25 enero, 2013 13:23

    Lizbeth creo que una opción es usar los eventos onclientclick para controles asp llamando al javascript del cliente y a su vez usar onclick que llamara al codigo del servidor

  11. Oscar Vela el 20 noviembre, 2013 0:42

    Sólo para comentar que la función UniqueIDWithDollars está de más, y que con sólo usar la propiedad ClientID nos devuelve el UniqueID con los ‘$’.

    El ClientID es el id con el que se accesa desde el cliente (javascript).

    UniqueID es el id con el que lo identifica el servidor

    por eso el ClientID aparece en el atributo ID y el UniqueID en el name. Ejemplo de un textbox renderizado:

    ASP:

    Renderizado

  12. raciel moreno el 20 diciembre, 2013 8:18

    .ASPX

    var boton = document.getElementById(‘Button1′);
    boton.click();

    .ASPX.CS
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim s As String = “”
    End Sub

Deja un comentario




  • Puede Interesarte

  • Archivo

    diciembre 2014
    L M X J V S D
    « mar    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031