J'ai eu envie de le faire et j'ai passé en revue les réponses ci-dessus et j'en ai fait une approche hybride. C'était un peu délicat, mais voici ce que j'ai fait :
Mon bouton fonctionnait déjà avec un post côté serveur. Je voulais que cela continue à fonctionner, j'ai donc laissé le "OnClick" inchangé, mais j'ai ajouté un OnClientClick :
OnClientClick="if (!OnClick_Submit()) return false;"
Voici mon élément de bouton complet au cas où cela aurait de l'importance :
<asp:Button UseSubmitBehavior="false" runat="server" Class="ms-ButtonHeightWidth jiveSiteSettingsSubmit" OnClientClick="if (!OnClick_Submit()) return false;" OnClick="BtnSave_Click" Text="<%$Resources:wss,multipages_okbutton_text%>" id="BtnOK" accesskey="<%$Resources:wss,okbutton_accesskey%>" Enabled="true"/>
Si j'inspecte l'attribut onclick du bouton HTML au moment de l'exécution, il ressemble en fait à ceci :
if (!OnClick_Submit()) return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$PlaceHolderMain$ctl03$RptControls$BtnOK", "", true, "", "", false, true))
Ensuite, dans mon Javascript, j'ai ajouté la méthode OnClick_Submit. Dans mon cas, j'avais besoin de vérifier si je devais montrer une boîte de dialogue à l'utilisateur. Si j'affiche la boîte de dialogue, je renvoie false, ce qui entraîne l'arrêt du traitement de l'événement. Si je n'affiche pas la boîte de dialogue, je renvoie true, ce qui fait que l'événement continue à être traité et que ma logique de retour s'exécute comme elle le faisait auparavant.
function OnClick_Submit() {
var initiallyActive = initialState.socialized && initialState.activityEnabled;
var socialized = IsSocialized();
var enabled = ActivityStreamsEnabled();
var displayDialog;
// Omitted the setting of displayDialog for clarity
if (displayDialog) {
$("#myDialog").dialog('open');
return false;
}
else {
return true;
}
}
Ensuite, dans mon code Javascript qui s'exécute lorsque la boîte de dialogue est acceptée, je fais ce qui suit en fonction de la façon dont l'utilisateur a interagi avec la boîte de dialogue :
$("#myDialog").dialog('close');
__doPostBack('message', '');
Le "message" ci-dessus est en fait différent selon le message que je veux envoyer.
Mais attendez, il y a plus !
Dans mon code côté serveur, j'ai changé OnLoad de :
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
return;
}
// OnLoad logic removed for clarity
}
A :
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
switch (Request.Form["__EVENTTARGET"])
{
case "message1":
// We did a __doPostBack with the "message1" command provided
Page.Validate();
BtnSave_Click(this, new CommandEventArgs("message1", null));
break;
case "message2":
// We did a __doPostBack with the "message2" command provided
Page.Validate();
BtnSave_Click(this, new CommandEventArgs("message2", null));
break;
}
return;
}
// OnLoad logic removed for clarity
}
Ensuite, dans la méthode BtnSave_Click, je fais ce qui suit :
CommandEventArgs commandEventArgs = e as CommandEventArgs;
string message = (commandEventArgs == null) ? null : commandEventArgs.CommandName;
Et enfin, je peux fournir une logique basée sur le fait que j'ai ou non un message et sur la valeur de ce message.