Cómo usar __doPostBack ()


161

Estoy tratando de crear una devolución de datos asincrónica en ASP.NET usando __doPostBack(), pero no tengo idea de cómo hacerlo. Quiero usar JavaScript de vainilla.

Algo simple como hacer clic en un botón puede hacer que el __doPostBack()evento se active . Solo estoy tratando de aprender cómo funciona el mecanismo.



9
En primer lugar, __doPostBack no causa una acción asincrónica a menos que sea activada por el control dentro de UpdatePanel.
Ladislav Mrnka

¿Por qué está etiquetado C # y JavaScript ? Entiendo la parte de JavaScript , pero no la parte de C # .
Solomon Ucko

1
@Solomon Ucko - porque __doPostBack () hace que la página POST a su implementación del lado del servidor, que probablemente estará en C # (podría ser VB.NET)
sh1rts

1
Si bien generalmente funciona, la inserción manual __doPostBackno es realmente compatible. Si su página no tiene nada que active una devolución de datos, asp.net podría omitir la definición de la __doPostBackfunción. El enfoque admitido es llamar ClientScriptManager.GetPostBackEventReference, que devuelve una cadena en el formulario __doPostBack(...)y garantiza que __doPostBackesté definida.
Brian

Respuestas:


156

Puede intentar esto en su formulario web con un botón llamado btnSave, por ejemplo:

<input type="button" id="btnSave" onclick="javascript:SaveWithParameter('Hello Michael')" value="click me"/>

<script type="text/javascript">
function SaveWithParameter(parameter)
{
  __doPostBack('btnSave', parameter)
}
</script>

Y en su código detrás, agregue algo como esto para leer el valor y operar sobre él:

public void Page_Load(object sender, EventArgs e)
{
  string parameter = Request["__EVENTARGUMENT"]; // parameter
  // Request["__EVENTTARGET"]; // btnSave
}

Pruébalo y dinos si eso funcionó para ti.


1
Solo una pregunta rápida, __EVENTARGUMENT sería el parámetro o btnSave?
harsimranb

3
Es el parámetro. __EVENTTARGET te dará el botón.
Sr. Sr.

¿Qué sucede si tengo dos o más botones que hacen __doPostBack? Entonces, ¿cómo puedo diferenciarlos en el lado del servidor en page_load ().
khalid khan

1
¿Cuál es el caso cuando tengo más de un parámetro?
Wilson

1
@Wilson como otro pensó que su argumento podría ser datos JSON, que se pudo asignar a un objeto en el C #, se podría entonces utilizar Json.net a deserialise / serializar a oponerse etc.
Sr. Sr.

25

Esta también es una buena manera de hacer que los controles del lado del servidor devuelvan información dentro de FancyBox y / o jQuery Dialog . Por ejemplo, en FancyBox-div:

   <asp:Button OnClientClick="testMe('param1');" ClientIDMode="Static"  ID="MyButton"  runat="server" Text="Ok" >
</asp:Button>

JavaScript:

function testMe(params) {
    var btnID= '<%=MyButton.ClientID %>';          
    __doPostBack(btnID, params);
}

Page_Load del lado del servidor:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);

44
debe usar UniqueID, no ClientID.
Garr Godfrey

O establezca el ClientIDMode="Static"atributo de MyButton, para que ASP no altere la ID del botón.
David R Tribble

14

Aquí hay un breve tutorial sobre cómo __doPostBack()funciona.

Para ser sincero, no lo uso mucho; al menos directamente Muchos controles de servidor, (por ejemplo, Button, LinkButton, ImageButton, partes de la GridView, etc.) el uso __doPostBackcomo su mecanismo de nuevo poste.


Avance rápido 6 años después; Me sorprendería si todavía uso esto. El enfoque hacia el desarrollo web generalmente se ha alejado de la mentalidad donde se usan cosas como esta.
Phil

@ Phil - jaja, estaba leyendo este hilo ayer mientras miraba un error donde se implementó :) Parece bastante arcaico en estos días
Terry Delahunt

12
Reenviado rápidamente 6 años ... y ASP.NET Web Forms todavía lo hace. De ahí la abrumadora votación de la respuesta aceptada.
kbrimington

@kbrimington: No dije que ASP.NET no "seguirá haciendo esto". No espero que cambie mucho. Lo que quise decir es que menos personas usan ASP.NET WebForm para un nuevo desarrollo y otros están migrando fuera de él.
Phil

10

Solo me gustaría agregar algo a esta publicación asp:button. He intentado clientId y no parece funcionar para mí:

__doPostBack('<%= btn.ClientID%>', '');

Sin embargo, obtener el UniqueId parece volver a publicarse en el servidor, como a continuación:

__doPostBack('<%= btn.UniqueID%>', '');

Esto podría ayudar a alguien más en el futuro, por lo tanto, publicar esto.


1
Sí, estaba teniendo problemas ClientIDporque estaba usando ClientIDMode = Static. Utilizando UniqueIDtrabajado.
Phiter

He estado tratando de hacer que esto funcione y ni ClientID ni UniqueId funcionan para mí.
atamata

¡DIOS MIO! Pocos días tratando de resolver este problema. UniqueID resolvió el problema. Gracias amigo
Faiz Infy

2

Antigua pregunta, pero me gustaría agregar algo: al llamar doPostBack()puede usar el método de controlador de servidor para la acción.

Para un ejemplo:

__doPostBack('<%= btn.UniqueID%>', 'my args');

Se disparará, en el servidor:

protected void btn_Click(object sender, EventArgs e)

No encontré una mejor manera de obtener el argumento, así que todavía estoy usando Request["__EVENTARGUMENT"].


0

Como han dicho otros, debe proporcionar el UniqueID del control al método __doPostback ().

__doPostBack('<%= btn.UniqueID %>', '');

En el servidor, los valores de formulario enviados se identifican por el atributo de nombre de los campos en la página.

La razón por la que UniqueID funciona es porque UniqueID y nombre son, de hecho, lo mismo cuando el control del servidor se representa en HTML.

Aquí hay un artículo que describe qué es UniqueID:

La propiedad UniqueID también se usa para proporcionar valor para el atributo "nombre" HTML de los campos de entrada (casillas de verificación, listas desplegables y campos ocultos). UniqueID también juega un papel importante en las devoluciones de datos. La propiedad UniqueID de un control de servidor, que admite devoluciones, proporciona datos para el campo oculto __EVENTTARGET. El tiempo de ejecución de ASP.NET luego usa el campo __EVENTTARGET para encontrar el control que activó la devolución de datos y luego llama a su método RaisePostBackEvent.

src: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid


0

Así es como lo hago

    public void B_ODOC_OnClick(Object sender, EventArgs e)
    {
        string script="<script>__doPostBack(\'fileView$ctl01$OTHDOC\',\'{\"EventArgument\":\"OpenModal\",\"EncryptedData\":null}\');</script>";
        Page.ClientScript.RegisterStartupScript(this.GetType(),"JsOtherDocuments",script);               
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.