Comment utiliser __doPostBack ()


161

J'essaye de créer un postback asyncrhone dans ASP.NET en utilisant __doPostBack(), mais je n'ai aucune idée de comment le faire. Je veux utiliser du JavaScript vanille.

Quelque chose de simple comme un clic sur un bouton peut provoquer le déclenchement de l' __doPostBack()événement. J'essaie juste d'apprendre comment fonctionne le mécanisme.



9
Tout d'abord, __doPostBack ne provoque pas d'action asynchrone à moins qu'elle ne soit déclenchée par un contrôle dans UpdatePanel.
Ladislav Mrnka

Pourquoi est-ce étiqueté c # et javascript . Je comprends la partie javascript , mais pas la partie c # .
Solomon Ucko

1
@Solomon Ucko - parce que __doPostBack () provoque le POST de la page sur son implémentation côté serveur, qui sera très probablement en C # (pourrait être VB.NET)
sh1rts

1
Bien que cela fonctionne généralement, l'insertion manuelle __doPostBackn'est pas réellement prise en charge. Si votre page ne contient rien qui déclenche une publication, asp.net peut omettre de définir la __doPostBackfonction. L'approche prise en charge consiste à appeler ClientScriptManager.GetPostBackEventReference, qui renvoie une chaîne dans le formulaire __doPostBack(...)et garantit qu'elle __doPostBackest définie.
Brian

Réponses:


156

Vous pouvez essayer ceci dans votre formulaire Web avec un bouton appelé btnSave par exemple:

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

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

Et dans votre code, ajoutez quelque chose comme ceci pour lire la valeur et l'utiliser:

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

Essayez-le et dites-nous si cela a fonctionné pour vous.


1
Juste une petite question, __EVENTARGUMENT serait le paramètre ou btnSave?
harsimranb

3
C'est le paramètre. __EVENTTARGET vous donnera le bouton.
M. M. le

Et si j'ai deux boutons ou plus qui font __doPostBack, comment puis-je les différencier côté serveur dans page_load ().
khalid khan

1
Quel est le cas lorsque j'ai plus d'un paramètre?
Wilson

1
@Wilson comme un autre pensait que votre argument pourrait être des données Json qui pourraient être mappées à un objet dans votre C #, vous pourriez alors utiliser Json.net pour désérialiser / sérialiser en objet etc.
M. M.

25

C'est également un bon moyen d'obtenir des contrôles côté serveur à publier dans FancyBox et / ou jQuery Dialog . Par exemple, dans 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 d'accueil du serveur:

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

4
doit utiliser UniqueID et non ClientID.
Garr Godfrey

Ou définissez l' ClientIDMode="Static"attribut de MyButton, afin que ASP ne modifie pas l'ID du bouton.
David R Tribble

14

Voici un bref tutoriel sur le __doPostBack()fonctionnement.

Pour être honnête, je ne l'utilise pas beaucoup; au moins directement. De nombreux contrôles de serveur, (par exemple, Button, LinkButton, ImageButton, parties du GridView, etc.) utilisent __doPostBackcomme mécanisme poteau.


Avance rapide 6 ans plus tard; Je serai choqué si je continue à l'utiliser. L'approche du développement Web s'est généralement éloignée de la mentalité où des choses comme celle-ci sont utilisées.
Phil

@Phil - haha, je lisais ce fil hier en regardant un bug où cela a été implémenté :) Cela semble assez archaïque de nos jours
Terry Delahunt

12
Avance rapide de 6 ans ... et ASP.NET Web Forms le fait toujours. D'où le vote favorable écrasant de la réponse acceptée.
kbrimington le

@kbrimington: Je n'ai pas dit qu'ASP.NET "ne le ferait toujours pas". Je ne m'attends pas à ce que cela change beaucoup. Ce que je voulais dire, c'est que moins de personnes utilisent ASP.NET WebForm pour de nouveaux développements et que d'autres en migrent.
Phil

10

Je voudrais juste ajouter quelque chose à ce post pour asp:button. J'ai essayé clientId et cela ne semble pas fonctionner pour moi:

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

Cependant, obtenir le UniqueId semble être renvoyé au serveur, comme ci-dessous:

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

Cela pourrait aider quelqu'un d'autre à l'avenir, donc publier ceci.


1
Ouais j'avais des problèmes avec ClientID, parce que j'utilisais ClientIDMode = Static. Utilisation UniqueIDtravaillé.
Phiter

J'ai essayé de faire fonctionner cela et ni ClientID ni UniqueId ne fonctionnent pour moi.
atamata

OMG! Quelques jours à essayer de résoudre ce problème. UniqueID a résolu le problème. Merci mec!
Faiz Infy le

2

Ancienne question, mais j'aimerais ajouter quelque chose: lors de l'appel, doPostBack()vous pouvez utiliser la méthode du gestionnaire de serveur pour l'action.

À titre d'exemple:

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

Se déclenchera, sur le serveur:

protected void btn_Click(object sender, EventArgs e)

Je n'ai pas trouvé de meilleur moyen d'obtenir l'argument, donc j'utilise toujours Request["__EVENTARGUMENT"].


0

Comme d'autres l'ont dit, vous devez fournir l'identifiant unique du contrôle à la méthode __doPostback ().

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

Sur le serveur, les valeurs de formulaire soumises sont identifiées par l' attribut name des champs de la page.

La raison pour laquelle UniqueID fonctionne est que UniqueID et le nom sont en fait la même chose lorsque le contrôle serveur est rendu en HTML.

Voici un article qui décrit ce qu'est l'identifiant unique:

La propriété UniqueID est également utilisée pour fournir une valeur pour l'attribut HTML "nom" des champs d'entrée (cases à cocher, listes déroulantes et champs masqués). UniqueID joue également un rôle majeur dans les publications. La propriété UniqueID d'un contrôle serveur, qui prend en charge les publications, fournit des données pour le champ masqué __EVENTTARGET. Le Runtime ASP.NET utilise ensuite le champ __EVENTTARGET pour rechercher le contrôle qui a déclenché la publication, puis appelle sa méthode RaisePostBackEvent.

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


0

C'est comme ça que je fais

    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);               
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.