Prevent a LinkButton double click inside an UpdatePanel
У меня есть LinkButton внутри UpdatePanel, и я не хочу, чтобы клиент нажимал более одного раза, прежде чем UpdatePanel обновит свое содержимое. Прямо сейчас кнопка ссылки инициирует частичную обратную передачу для каждого клика на стороне клиента, пока панель обновления не успеет обновить. Эта конкретная ссылка запускает очень дорогой процесс, который я бы предпочел не запускать без необходимости. Есть ли.NET стандартный способ сделать это? Какое хорошее решение для этого? Благодарю.
5 ответов
Используйте UpdatePanelAnimationExtender. Может использоваться для создания приятного опыта и предотвращения дальнейшего взаимодействия до тех пор, пока не закончится панель обновления. Объедините это с логическим значением DGH на стороне сервера, чтобы пользователь не обновлял страницу и не отправлял снова (сохраните логическое значение в состоянии сеанса).
Более подробную информацию о UpdatePanelAnimationExtender можно найти здесь:
https://github.com/DevExpress/AjaxControlToolkit/wiki/UpdatePanelAnimation
Я бы бросил enabled=false
на нем, пока не завершится частичная обратная передача, а затем удалите enabled=false
приписывать.
Попробуйте что-то вроде этого на Page_Load
поэтому он будет отключен в первый раз.
button.Attributes.Add("onclick",
"this.disabled = true;"
+ this.ClientScript.GetPostBackEventReference(button, String.Empty) + ";");
затем повторно включить его в конце частичной обратной передачи?
Одним из основных методов является запись времени, когда произошел последний щелчок в серверной переменной или переменной сеанса. При каждом клике проверяйте время последнего клика. Если интервал слишком мал, вернитесь без запуска остальной части процесса.
Другой метод состоит в том, чтобы установить логическое значение, такое как 'active', в true в начале метода и обратно в false в конце. В начале метода проверьте текущее состояние этой переменной и действуйте соответствующим образом.
Основное различие между этими двумя методами заключается в том, что первый позволяет одновременно запускать несколько экземпляров метода, если они находятся в шахматном порядке на достаточно длительном интервале. Второй метод всегда убивает или блокирует любые новые экземпляры метода, пока не закончится текущий.
Поместите следующий скрипт на страницу после 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>
Ни одно из вышеперечисленных решений не помогло мне.
Что я сделал, это:
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()">