Ich habe mich dabei ertappt, dass ich dies tun wollte, und ich habe mir die obigen Antworten angeschaut und einen Mischansatz daraus gemacht. Es wurde ein wenig kompliziert, aber ich habe es so gemacht:
Meine Schaltfläche funktionierte bereits mit einem serverseitigen Beitrag. Ich wollte, dass zu lassen, um weiterhin zu arbeiten, so dass ich die "OnClick" die gleichen, aber fügte eine OnClientClick:
OnClientClick="if (!OnClick_Submit()) return false;"
Hier ist mein vollständiges Schaltflächenelement, falls es von Bedeutung ist:
<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"/>
Wenn ich das onclick-Attribut der HTML-Schaltfläche zur Laufzeit untersuche, sieht es tatsächlich so aus:
if (!OnClick_Submit()) return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$PlaceHolderMain$ctl03$RptControls$BtnOK", "", true, "", "", false, true))
Dann habe ich in meinem Javascript die Methode OnClick_Submit hinzugefügt. In meinem Fall musste ich prüfen, ob ich dem Benutzer einen Dialog anzeigen muss. Wenn ich den Dialog zeige, gebe ich false zurück, was dazu führt, dass das Ereignis nicht weiter verarbeitet wird. Wenn ich den Dialog nicht zeige, gebe ich true zurück, wodurch das Ereignis weiter verarbeitet wird und meine Postback-Logik wie gewohnt abläuft.
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;
}
}
Dann in meinem Javascript-Code, der ausgeführt wird, wenn der Dialog akzeptiert wird, tue ich das Folgende, je nachdem, wie der Benutzer mit dem Dialog interagiert hat:
$("#myDialog").dialog('close');
__doPostBack('message', '');
Die obige "Nachricht" ist tatsächlich unterschiedlich, je nachdem, welche Nachricht ich senden möchte.
Aber halt, es gibt noch mehr!
Zurück in meinem Server-seitigen Code, änderte ich OnLoad von:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
return;
}
// OnLoad logic removed for clarity
}
Para:
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
}
Dann in BtnSave_Click-Methode tue ich das folgende:
CommandEventArgs commandEventArgs = e as CommandEventArgs;
string message = (commandEventArgs == null) ? null : commandEventArgs.CommandName;
Und schließlich kann ich eine Logik bereitstellen, die darauf basiert, ob ich eine Nachricht habe oder nicht, und die auf dem Wert dieser Nachricht basiert.