Я обнаружил, что хочу сделать это, и я рассмотрел вышеупомянутые ответы и сделал их гибридный подход. Это немного сложно, но вот что я сделал:
Моя кнопка уже работала с постом на стороне сервера. Я хотел, чтобы это продолжало работать, поэтому я оставил «OnClick» тем же, но добавил OnClientClick:
OnClientClick="if (!OnClick_Submit()) return false;"
Вот мой полный элемент кнопки на случай, если это имеет значение:
<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"/>
Если я проверяю атрибут onclick кнопки HTML во время выполнения, он на самом деле выглядит следующим образом:
if (!OnClick_Submit()) return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$PlaceHolderMain$ctl03$RptControls$BtnOK", "", true, "", "", false, true))
Затем в своем Javascript я добавил метод OnClick_Submit. В моем случае мне нужно было проверить, нужно ли показывать диалог пользователю. Если я показываю диалоговое окно, я возвращаю false, вызывая остановку обработки события. Если я не показываю диалоговое окно, я возвращаю истину, заставляя событие продолжить обработку и моя логика обратной передачи запускается как раньше.
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;
}
}
Затем в моем коде Javascript, который запускается при принятии диалога, я делаю следующее в зависимости от того, как пользователь взаимодействовал с диалогом:
$("#myDialog").dialog('close');
__doPostBack('message', '');
«Сообщение» выше фактически отличается в зависимости от того, какое сообщение я хочу отправить.
Но подождите, это еще не все!
Вернувшись в свой серверный код, я изменил OnLoad с:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
return;
}
// OnLoad logic removed for clarity
}
Кому:
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
}
Затем в методе BtnSave_Click я делаю следующее:
CommandEventArgs commandEventArgs = e as CommandEventArgs;
string message = (commandEventArgs == null) ? null : commandEventArgs.CommandName;
И, наконец, я могу предоставить логику, основанную на том, есть ли у меня сообщение, и на основе значения этого сообщения.