У меня есть LinkButton внутри UpdatePanel, и я не хочу, чтобы клиент нажимал более одного раза, прежде чем UpdatePanel обновит свое содержимое. Прямо сейчас кнопка ссылки инициирует частичную обратную передачу для каждого щелчка на стороне клиента, пока панель обновлений не успеет обновиться. Эта конкретная ссылка запускает очень дорогостоящий процесс, который я бы предпочел не запускать без надобности. Есть ли стандартный способ .NET? Какое для этого хорошее решение? Спасибо.
Предотвращение двойного щелчка LinkButton внутри UpdatePanel
Ответы (5)
Используйте UpdatePanelAnimationExtender. Может использоваться для создания приятного впечатления и предотвращения дальнейшего взаимодействия, пока панель обновлений не будет завершена. Объедините это с логическим значением на стороне сервера DGH, чтобы предотвратить обновление страницы и повторную отправку пользователем (сохраните логическое значение в состоянии сеанса).
Более подробную информацию об UpdatePanelAnimationExtender можно найти здесь:
https://github.com/DevExpress/AjaxControlToolkit/wiki/UpdatePanelAnimation
Один из основных методов - записать время последнего щелчка в переменной на стороне сервера или сеанса. При каждом щелчке сверяйте время последнего щелчка. Если интервал слишком мал, вернитесь, не начиная остальную часть процесса.
Другой метод - установить для логического значения, такого как «active», значение true в начале метода и обратно в значение false в конце. В начале метода проверьте текущее состояние этой переменной и действуйте соответствующим образом.
Основное различие между этими двумя методами заключается в том, что первый позволяет запускать несколько экземпляров метода одновременно, если они смещены на достаточно длинный интервал. Второй метод всегда уничтожает или блокирует любые новые экземпляры метода до тех пор, пока не закончится текущий.
Я бы поставил на него enabled=false
до завершения частичной обратной передачи, а затем удалил бы атрибут enabled=false
.
Попробуйте что-нибудь подобное на Page_Load
, чтобы он отключился в первый раз.
button.Attributes.Add("onclick",
"this.disabled = true;"
+ this.ClientScript.GetPostBackEventReference(button, String.Empty) + ";");
затем снова включить его в конце частичной обратной передачи?
Ни одно из вышеперечисленных решений не помогло мне.
Я сделал следующее:
function InitializeRequest(sender, args) {
var oSender = args._postBackElement;
if (oSender.id == "btnSave") {
oSender.href = "javascript: void(0);";
}
}
function EndRequestHandler(sender, args) {
var oSender = sender._postBackSettings.sourceElement;
if (oSender.id == "btnSave") {
oSender.href = "__doPostBack('" + oSender.id + "', '');";
}
}
function load() {
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}
<body onload="load()">
Поместите следующий сценарий на страницу после ScriptManager.
<script type="text/javascript">
var postbackControl = null;
var parm = Sys.WebForms.PageRequestManager.getInstance();
parm.add_beginRequest(BeginRequestHandler);
parm.add_endRequest(EndRequestHandler);
function BeginRequestHandler(sender, args)
{
postbackControl = args.get_postBackElement();
postbackControl.disabled = true;
}
function EndRequestHandler(sender, args)
{
postbackControl.disabled = false;
postbackControl = null;
}
</script>