Отключить кнопку «Отправить» в случае многократного щелчка .. (C #) - PullRequest
4 голосов
/ 03 декабря 2010

Моя проблема в том, что у меня есть простая веб-форма, которая содержит два текстовых поля и кнопку. На странице есть некоторые элементы управления валидатора asp.net. Поэтому я хочу отключить кнопку на стороне клиента, когда вся проверка будет выполнена. отключение кнопки, я выполняю некоторый код на стороне сервера. Все это работает нормально, но, в случае, когда я устанавливаю обратный URL-адрес кнопки, происходит сбой. Ниже приведена некоторая часть кодирования, которая даст вам краткое представление. Любой намек будет высоко оценен .......

Я хотел сделать эту функцию в композитном управлении. вот кнопка класс

public class MyButton : Button
{

    protected override void OnPreRender(EventArgs e)
    {
        if (this.CausesValidation)
        {
            if (!String.IsNullOrEmpty(this.ValidationGroup))
            {
                this.Attributes.Add("onclick", @"javascript:

             if (typeof(Page_ClientValidate) == 'function')
                 {
                    if (Page_ClientValidate('" + this.ValidationGroup + "')){" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) +

              "}else{return;}}  else{" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) + "}");
            }

            else
            {
                this.Attributes.Add("onclick", @"javascript:

                 if (typeof(Page_ClientValidate) == 'function')
                   {
                      if (Page_ClientValidate()){" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) +
                  "}else{return;}}  else{" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) + "}");
            }
        }
        else
            this.Attributes.Add("onclick", "javascript:" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this));

        base.OnPreRender(e);
    }

Ответы [ 6 ]

11 голосов
/ 29 октября 2011

Это правильный и простой способ сделать это:

Создайте вспомогательный метод в вашем приложении (скажем, в пространстве имен Utlity):

    Public Shared Sub PreventMultipleClicks(ByRef button As System.Web.UI.WebControls.Button)
        button.Attributes.Add("onclick", "this.disabled=true;" & button.Page.ClientScript.GetPostBackEventReference(button, String.Empty).ToString)
    End Sub

Теперь из кода за каждой из ваших веб-страниц вы можете просто позвонить:

    Utility.PreventMultipleClicks(button1)

где button1 - это кнопка, которую вы хотите предотвратить несколькими нажатиями.

Для этого просто устанавливается обработчик нажатия: this.disabled = true

, а затем добавляет кнопки собственного обработчика обратной записи, так что мы получаем:

onclick="this.disabled=true";__doPostBack('ID$ID','');"

Это не нарушает поведение страницы по умолчанию и работает во всех браузерах, как и ожидалось.

Наслаждайтесь!

1 голос
/ 16 января 2012

Если вы отключите кнопку отправки после ее нажатия, она не будет отправлена ​​обратно. Я исследовал это в течение многих часов, и лучшее решение, которое я видел, здесь . (лучшее решение - внизу страницы)

Сейчас я пишу пользовательский серверный элемент управления для добавления в набор инструментов, который простирается от Button и использует слегка измененную версию этого кода. (переопределяет метод OnLoad)

Я даю пользователю возможность изменить текст «обработка ...» на что-то другое и может создать атрибут, который позволяет тексту измениться на что-то другое, когда отправка завершена (что будет производиться при обратной передаче). возвраты)

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

Если вы отключите кнопку, отправка формы не произойдет. Правильный способ будет установить таймер для отключения кнопки. Я бы также предложил использовать поведение отправки вместо добавления ссылки на событие после возврата. Например,

function clickHandler(id, validate, validationGroup) {
   var isValid = true;
   if (validate && typeof(Page_ClientValidate) == 'function') {
     isValid = validationGroup? Page_ClientValidate(validationGroup): Page_ClientValidate();
   }
   if (isValid)
   {
      // set timer to disable the button
      var b = document.getElementById(id);
      var f = function() { b.disabled = 'disabled'; };
      setTimeout(f, 100);
      return true;
   }
   return false;
}

А теперь добавьте функцию к вашей кнопке

protected override void OnPreRender(EventArgs e)
{
    this.Attributes.Add("onclick", 
       string.Format("return clickHandler('{0}', {1}, '{2}')", 
       this.ClientID, this.CausesValidation ? "true" : "false", 
       this.ValidationGroup));
}
0 голосов
/ 06 июля 2015

У меня была эта проблема, и ни одно из предыдущих решений не помогло мне, но после некоторого возни я использовал:

<asp:LinkButton runat="server" OnClientClick="this.setAttribute('disabled','disabled'); this.text = 'Submit in progress...';" UseSubmitBehavior="false" ID="btnSubmit" ValidationGroup="formSubmit"</asp:LinkButton>
0 голосов
/ 27 ноября 2014

Предполагая, что это асинхронно, и что вы проверяете перед сохранением, вы можете попробовать следующее:

    bool hasSavedAlready = false;

    savedata(){
       if (!hasSavedAlready){ 
       //normal saving code
       ...
       //after success
       hasSavedAlready = true;

       }
    }

Это самое простое решение, которое я могу придумать.

0 голосов
/ 29 сентября 2011

Я придумал решение.Просто скройте кнопку после того, как вы нажмете на нее.Обратная передача будет проходить как обычно.После завершения обратной передачи вы получите свою кнопку как есть!Смотрите подробные инструкции по , как отключить кнопку asp.net при обратной передаче и освоить искусство!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...