Como usar __doPostBack ()


161

Estou tentando criar uma postagem assíncrona no ASP.NET usando __doPostBack(), mas não tenho idéia de como fazê-lo. Eu quero usar JavaScript baunilha.

Algo simples como um clique no botão pode causar o __doPostBack()disparo do evento. Eu só estou tentando aprender como o mecanismo funciona.



9
Primeiro, __doPostBack não causa ação assíncrona, a menos que seja acionada pelo controle dentro do UpdatePanel.
Ladislav Mrnka

Por que isso está marcado com c # e javascript . Eu entendo a parte javascript , mas não a parte c # .
Solomon Ucko

1
@Solomon Ucko - porque __doPostBack () faz com que a página para postar em sua implementação do lado do servidor, que provavelmente será em C # (poderia ser VB.NET)
sh1rts

1
Embora normalmente funcione, a inserção manual __doPostBacknão é realmente suportada. Se sua página não possui nada que desencadeie uma postagem, o asp.net pode omitir a definição da __doPostBackfunção. A abordagem suportada é chamar ClientScriptManager.GetPostBackEventReference, que retorna uma sequência no formulário __doPostBack(...)e garante que ela __doPostBackesteja definida.
Brian

Respostas:


156

Você pode tentar isso em seu formulário da web com um botão chamado btnSave, por exemplo:

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

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

E no seu código por trás, adicione algo assim para ler o valor e operar com ele:

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

Experimente e informe-nos se isso funcionou para você.


1
Apenas uma pergunta rápida, __EVENTARGUMENT seria o parâmetro ou btnSave?
harsimranb

3
É o parâmetro __EVENTTARGET fornece o botão.
Mr. Mr.

e se eu tiver dois ou mais botões que executam __doPostBack, como os diferencio no servidor em page_load ().
Khalid khan

1
Qual é o caso quando tenho mais de um parâmetro?
Wilson Wilson

1
@Wilson como outro pensou que seu argumento poderia ser dados JSON que poderia mapeiam para um objeto em seu C #, você pode então usar Json.net para deserialise / serialise se opor etc.
Sr. Sr.

25

Essa também é uma boa maneira de fazer com que os controles do servidor sejam postados dentro da FancyBox e / ou do jQuery Dialog . Por exemplo, em 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 do servidor:

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

4
deve usar UniqueID, não ClientID.
precisa

Ou defina o ClientIDMode="Static"atributo de MyButton, para que o ASP não altere a identificação do botão.
precisa

14

Aqui está um breve tutorial sobre como __doPostBack()funciona.

Para ser sincero, não uso muito; pelo menos diretamente. Muitos controles de servidor, (por exemplo, Button, LinkButton, ImageButton, partes do GridView, etc.) uso __doPostBackcomo mecanismo posto de volta.


Avanço rápido 6 anos depois; Ficarei chocado se ainda usar isso. A abordagem para o desenvolvimento da web geralmente se afastou da mentalidade em que coisas como essa são usadas.
Phil

@Phil - haha, eu estava lendo esta discussão ontem enquanto olha para um bug onde este foi implementado :) Parece bastante arcaica nos dias de idade
Terry Delahunt

12
Avanço rápido de 6 anos ... e o ASP.NET Web Forms ainda faz isso. Daí a votação esmagadora da resposta aceita.
precisa saber é o seguinte

@ kbrimington: Eu não disse que o ASP.NET "ainda não fará isso". Não espero que mude muito. O que eu quis dizer é que menos pessoas usam o ASP.NET WebForm para novos desenvolvimentos e outras estão migrando dele.
Phil

10

Gostaria de adicionar algo a este post para asp:button. Eu tentei o clientId e não parece funcionar para mim:

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

No entanto, a obtenção do UniqueId parece ser postada novamente no servidor, como abaixo:

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

Isso pode ajudar alguém no futuro, portanto, publicando isso.


1
Sim, eu estava tendo problemas ClientID, porque estava usando ClientIDMode = Static. Usando UniqueIDtrabalhou.
Phiter 10/10/16

Eu tenho tentado fazer isso funcionar e nem ClientID nem UniqueId funcionam para mim.
atamata

AMD! Poucos dias tentando resolver esse problema. O UniqueID resolveu o problema. Valeu cara!
Faiz Infy 03/02

2

Pergunta antiga, mas eu gostaria de acrescentar algo: ao chamar, doPostBack()você pode usar o método manipulador de servidor para a ação.

Por exemplo:

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

Disparará, no servidor:

protected void btn_Click(object sender, EventArgs e)

Não encontrei uma maneira melhor de obter o argumento, então ainda estou usando Request["__EVENTARGUMENT"].


0

Como outros já disseram, você precisa fornecer o UniqueID do controle para o método __doPostback ().

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

No servidor, os valores do formulário enviados são identificados pelo atributo name dos campos na página.

O motivo pelo qual o UniqueID funciona é porque o UniqueID e o nome são de fato a mesma coisa quando o controle do servidor é renderizado em HTML.

Aqui está um artigo que descreve o que é o UniqueID:

A propriedade UniqueID também é usada para fornecer valor ao atributo HTML "name" dos campos de entrada (caixas de seleção, listas suspensas e campos ocultos). UniqueID também desempenha papel importante em postbacks. A propriedade UniqueID de um controle de servidor, que oferece suporte a postbacks, fornece dados para o campo oculto __EVENTTARGET. O tempo de execução do ASP.NET usa o campo __EVENTTARGET para localizar o controle que acionou a postagem e, em seguida, chama seu método RaisePostBackEvent.

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


0

É assim que eu faço

    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);               
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.