Предотвратить двойной щелчок LinkButton внутри UpdatePanel - PullRequest
2 голосов
/ 01 декабря 2010

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

Ответы [ 5 ]

4 голосов
/ 01 декабря 2010

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

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

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

2 голосов
/ 01 декабря 2010

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

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

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

1 голос
/ 01 декабря 2010

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

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

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

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

0 голосов
/ 30 мая 2015

Поместите следующий скрипт на страницу после 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>
0 голосов
/ 29 мая 2013

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

То, что я сделал, это:

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()">
...