Вы можете использовать скрытое поле, но вам все равно придется форсировать обратную передачу после того, как пользователь отклонит поле подтверждения.Так как вы в конечном итоге вызовете __ doPostBack () в любом случае, вы можете воспользоваться его вторым аргументом для отправки возвращаемого значения confirm()
обратно на сервер без использования скрытого поля:
if (originalId != newId) {
ScriptManager.RegisterStartupScript(this, GetType(), "ajax",
String.Format(CultureInfo.InvariantCulture, @"
__doPostBack('{0}', confirm('Are you sure?').toString());
", yourUpdatePanel.ClientID), true);
} else if (Page.Request["__EVENTTARGET"] == yourUpdatePanel.ClientID) {
bool userClickedOK = Boolean.Parse(Page.Request["__EVENTARGUMENT"]);
if (userClickedOK) {
// Add some data to SQL.
} else {
return;
}
}
Сначала мы сравним два идентификатора.Если они разные, нам нужно показать окно подтверждения на клиенте и отправить его результат обратно на сервер, поэтому мы включаем для этого скрипт запуска (обратите внимание, что вы можете передать true
в качестве последнего аргумента RegisterStartupScript () , чтобы он генерировал для вас теги <script>
.
Затем на стороне клиента нам нужно вызвать __doPostBack()
для принудительной обратной передачи после вызова блокировки наconfirm()
возвращается.__doPostBack()
принимает два аргумента: ClientID
элемента управления, который инициировал обратную передачу (цель события ), и необязательный аргумент события .Они используются внутренним каналом ASP.NET для создания событий обратной передачи, но это не значит, что мы не можем использовать их в наших интересах.
Более того, если происходит обратная передача и UpdatePanel
является целью события, вышеупомянутая сантехника ASP.NET будет только обновлять эту панель (или больше, в зависимости от их свойств UpdateMode
, но это другая тема).Поэтому мы вызываем __doPostBack()
с ClientID
из UpdatePanel
, содержащим элементы управления, которые мы хотим обновить, и возвращаемым значением confirm()
, преобразованным в строку.
Назад на сторону сервера,страница перезагружается, и наш код запускается снова.Поскольку в комментариях к вашему вопросу вы подразумевали, что если originalId
и newId
все еще различаются, нам придется снова показывать окно подтверждения, я предполагаю, что в этот раз они будут одинаковыми (else if
гарантирует это).
Аргументы, передаваемые __doPostBack()
, доступны на стороне сервера из переменных запроса __EVENTTARGET
и __EVENTARGUMENT
.Итак, во-первых, мы проверяем, является ли цель события нашим UpdatePanel
, и если это так, мы знаем, что обрабатываем принудительную обратную передачу, и значение __EVENTARGUMENT
имеет смысл.Поэтому мы вызываем Boolean.Parse () , чтобы десериализовать его из строки, сгенерированной нами ранее на стороне клиента, и использовать ее, чтобы решить, обновлять ли базу данных или нет.