Предотвращение двойного щелчка LinkButton внутри UpdatePanel

У меня есть LinkButton внутри UpdatePanel, и я не хочу, чтобы клиент нажимал более одного раза, прежде чем UpdatePanel обновит свое содержимое. Прямо сейчас кнопка ссылки инициирует частичную обратную передачу для каждого щелчка на стороне клиента, пока панель обновлений не успеет обновиться. Эта конкретная ссылка запускает очень дорогостоящий процесс, который я бы предпочел не запускать без надобности. Есть ли стандартный способ .NET? Какое для этого хорошее решение? Спасибо.


person Tim Santeford    schedule 30.11.2010    source источник


Ответы (5)


Используйте UpdatePanelAnimationExtender. Может использоваться для создания приятного впечатления и предотвращения дальнейшего взаимодействия, пока панель обновлений не будет завершена. Объедините это с логическим значением на стороне сервера DGH, чтобы предотвратить обновление страницы и повторную отправку пользователем (сохраните логическое значение в состоянии сеанса).

Более подробную информацию об UpdatePanelAnimationExtender можно найти здесь:

https://github.com/DevExpress/AjaxControlToolkit/wiki/UpdatePanelAnimation

person theChrisKent    schedule 30.11.2010
comment
1+ Работает отлично. Я опубликую решение в ближайшее время. - person Tim Santeford; 01.12.2010

Один из основных методов - записать время последнего щелчка в переменной на стороне сервера или сеанса. При каждом щелчке сверяйте время последнего щелчка. Если интервал слишком мал, вернитесь, не начиная остальную часть процесса.

Другой метод - установить для логического значения, такого как «active», значение true в начале метода и обратно в значение false в конце. В начале метода проверьте текущее состояние этой переменной и действуйте соответствующим образом.

Основное различие между этими двумя методами заключается в том, что первый позволяет запускать несколько экземпляров метода одновременно, если они смещены на достаточно длинный интервал. Второй метод всегда уничтожает или блокирует любые новые экземпляры метода до тех пор, пока не закончится текущий.

person DGH    schedule 30.11.2010
comment
Моя компания не рекомендует использовать сеанс для решения подобных одноразовых проблем, и я не могу использовать глобальные переменные сервера. - person Tim Santeford; 01.12.2010
comment
@Tim: Я понимаю желание минимизировать общее количество переменных сеанса. Тем не менее, это может быть тот случай, когда нет других доступных способов обхода. - person DGH; 01.12.2010

Я бы поставил на него enabled=false до завершения частичной обратной передачи, а затем удалил бы атрибут enabled=false.

Попробуйте что-нибудь подобное на Page_Load, чтобы он отключился в первый раз.

button.Attributes.Add("onclick",
                "this.disabled = true;"
                + this.ClientScript.GetPostBackEventReference(button, String.Empty) + ";");

затем снова включить его в конце частичной обратной передачи?

person Nate    schedule 30.11.2010
comment
+1 Я думаю, что это решение сработает, но я пошел с ответом ChrisKent. благодаря. - person Tim Santeford; 01.12.2010

Ни одно из вышеперечисленных решений не помогло мне.

Я сделал следующее:

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()">
person mbiker    schedule 29.05.2013

Поместите следующий сценарий на страницу после 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>
person SharingIsGood    schedule 30.05.2015