ASP.Net проблема двойного щелчка

возникли небольшие проблемы с моей страницей ASP.net. Если пользователь дважды щелкнет наОтправить" Кнопка будет записывать в базу данных дважды (т.е. выполнитьпо щелчку' метод на кнопку изображения дважды)

Как я могу сделать так, чтобы, если пользователь нажимал на кнопку с изображением, была отключена только кнопка с изображением?

мы пробовали:


Но это свойство OnClientClick полностью останавливает отправку страницы! Любая помощь?

Извините, да, у меня есть контроль Валидации ... отсюда и проблема.

Работаем над этим до сих пор, до этого момента:

ASP-код:

 
 ...
 

Код C #:

         private Random
    random = new Random();


    protected void Page_Load(object sender, EventArgs e)
    {
        //Use a Token to make sure it has only been clicked once.
        if (Page.IsPostBack)
        {
            if (double.Parse(hidToken.Text) == ((double)Session["NextToken"]))
            {
                InputMethod();
            }
            else
            {
                // double click
            }
        }

        double next = random.Next();

        hidToken.Text = next + "";
        Session["NextToken"] = next;

На самом деле ... это почти работает. Проблема двойного щелчка в значительной степени исправлена (ууу!) Изображение все еще не 'хотя спрятан

Ответы на вопрос(6)

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

для тех, кто просто хочет сделать быстрое исправление, просто скройте его и покажите другую кнопку, у которой нет событий




 function hideit() {



        var btn = $get('');
        var btn2 = $get('');
        if (btn != null)
        {

            btn.style.display = 'none';
            btn2.style.display = 'block'
        }
 }
    
Решение Вопроса

Общий подход двоякий.

Serverside:

При загрузке страницы сгенерируйте токен (используяSystem.Random), сохраните его в сеансе и запишите в скрытое поле формыПри отправке убедитесь, что скрытое поле формы равно переменной сеанса (до настраиваю снова)Работай

Сторона клиента:

Похоже на то, что у вас есть, но, вероятно, просто спрячьте кнопку и замените ее текстом:представление.

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

Полный пример следующим образом:

C # (включает код, чтобы увидеть его в действии):



    double-click test
    
    private Random
        random = new Random();

    private static int
        TEST = 0;

    public void Page_Load (object sender, EventArgs ea)
    {
        SetToken();
    }

    private void btnTest_Click (object sender, EventArgs ea)
    {
        if( IsTokenValid() ){
            DoWork();
        } else {
            // double click
            ltlResult.Text = "double click!";
        }
    }

    private bool IsTokenValid ()
    {
        bool result = double.Parse(hidToken.Value) == ((double) Session["NextToken"]);
        SetToken();
        return result;
    }

    private void SetToken ()
    {
        double next = random.Next();

        hidToken.Value       = next + "";
        Session["NextToken"] = next;
    }


    private void DoWork ()
    {
        TEST++;
        ltlResult.Text = "DoWork(): " + TEST + ".";
    }
    


    
        var last = null;
        function f (obj)
        {
            obj.src = "http://www.gravatar.com/avatar/4659883ec420f39723c3df6ed99971b9?s=32&d=identicon&r=PG";
            // Note: Disabling it here produced strange results. More investigation required.
            last = obj;
            setTimeout("reset()", 1 * 1000);
            return true;
        }

        function reset ()
        {
            last.src = "http://www.gravatar.com/avatar/495ce8981a5127a9fd24bd72e7e3664a?s=32&d=identicon&r=PG";
            last.disabled = "false";
        }
    
    
        
        
        <pre>Result: </pre>
    


 David Archer01 окт. 2009 г., 12:18
Вау, круто, это действительно помогло! +1!
 Mitch Wheat30 сент. 2009 г., 16:02
+1. отлично .......
 David Archer01 окт. 2009 г., 11:58
Пожалуйста, смотрите последнее дополнение, все еще возникают проблемы ...
 MusiGenesis30 сент. 2009 г., 16:05
Там'Нет встроенного, простого способа решения этой проблемы в ASP.Net?
 LukeH01 окт. 2009 г., 11:26
@silky: Да, этоэто точно!
 Noon Silk01 окт. 2009 г., 12:18
Хорошо. Из-за смущения, что я немного ошибаюсь,Я написал полный пример. Я думаю, что это должно работать (Javascript, чтобы установить отключение может быть немного неправильно). Пожалуйста, проверьте и дайте мне знать. По какой-то причине я могуне отдыхай, пока не получится ...: P
 MusiGenesis30 сент. 2009 г., 17:07
@silky: еще одна причина, по которой ASP.Net сосет Cheez Whiz через гибкую трубочку. Вздох. Они могли бы просто спроектировать ASP.Net как разумную платформу веб-разработки, вместо этого пытаясь позволить разработчикам притвориться, что они все еще кодируют приложение Windows, но неаооооо ...
 mbomb00725 окт. 2016 г., 16:06
@JanAagaard That 'с "особенность" ASP.NET. Вы не можете начать с отключенной кнопки и ожидать, что все будет работать.stackoverflow.com/a/8539020/2415524
 MusiGenesis30 сент. 2009 г., 17:08
Также +1, чтобы испортить вам 7777 совершенства. Увидимся на 8888.
 David Archer30 сент. 2009 г., 16:34
Вот так: int token = 0; Page_Load () {System.Random rand = new Random (); int token = rand.Next (1,1000000000000); Секция [»Знак»] = токен; //Что-нибудь еще? } methodName () {// Что будет первым? submissionMethod (); } А что-нибудь еще о реальном ASP.net?
 LukeH01 окт. 2009 г., 11:21
@silky: маленький щупальец - ты не должент использовать статическийRandom как это в.aspx страница без какой-либо блокировки вокруг него.
 Jan Aagaard18 дек. 2009 г., 14:59
Проголосовал, потому что код нет работа. Если вы отключите кнопку, событие на стороне сервера не будет запущено. И reset () жалуется, что объект не определен.
 Noon Silk30 сент. 2009 г., 16:11
MusiGenesis: все, что я знаю, так это то, что у меня сейчас 7777 представителей, и я никогда больше не хочу (ffonline.com/media/guides/ff7/ffvii_faq_lucky7.txt) (И нет).
 Noon Silk01 окт. 2009 г., 11:24
Люк: почему? Есть ли какая-то проблема с двумя потоками внутри?.Next в то же время? Хм, наверное, есть. Хорошо яЯ изменю это, чтобы не быть статичным.
 Robin Day29 июл. 2010 г., 17:26
Я неПредположим, есть какие-либо варианты, которые нене полагаетесь на сессию для токена? Если у пользователя есть две открытые формы ввода данных, заполняющие их обе, вторая отправка не будет работать.
 Noon Silk01 окт. 2009 г., 00:57
Дэвид: Добавил больше информации, MusiGenesis: Черт, Митч: Спасибо :)

Если у вас есть проверка на странице, отключение кнопки на стороне клиента становится немного сложнее. Если проверка не пройдена, вы неЯ не хочу отключать кнопку. Вот's фрагмент, который добавляет обработчик событий на стороне клиента:

private void BuildClickOnceButton(WebControl ctl)

{

System.Text.StringBuilder sbValid = new System.Text.StringBuilder();

sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");

sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");

sbValid.Append(ctl.ClientID + ".value = 'Please wait...';");

sbValid.Append(ctl.ClientID + ".disabled = true;");

// GetPostBackEventReference obtains a reference to a client-side script 
// function that causes the server to post back to the page.

sbValid.Append(ClientScript.GetPostBackEventReference(ctl, ""));

sbValid.Append(";");

ctl.Attributes.Add("onclick", sbValid.ToString());

}

Видеть этопоток asp.net для получения дополнительной информации.

Обновить: приведенный выше код будет использоваться для добавления обработчика OnClientClick в коде позади. Вы также можете написать javascript в вашей разметке aspx следующим образом:


function disableButton(button)
{
    // if there are client validators on the page
    if (typeof(Page_ClientValidate) == 'function') 
    {
        // if validation failed return false
        // this will cancel the click event
        if (Page_ClientValidate() == false) 
        { 
            return false; 
        }
    }

    // change the button text (does not apply to an ImageButton)
    //button.value = "Please wait ...";
    // disable the button
    button.disabled = true;

    // fire postback
    __doPostBack(button.id, '');
}



 jrummell01 окт. 2009 г., 03:24
Я обновил свой ответ с примером. Надеюсь это поможет!
 Yuck12 нояб. 2012 г., 00:30
Это прекрасно. ИМХО, это должен быть официальный способ решения ASP .NET "Запретить форму двойной подачи ", Очень красиво сделано.
 David Archer01 окт. 2009 г., 11:10
Опять нене работает ... когда я пытаюсь использовать это, он все равно отключает все.
 Dicer01 июн. 2017 г., 18:09
Работает очень хорошо для меня. Отлично сработано.
 jrummell01 окт. 2009 г., 14:20
Вы получаете ошибку JavaScript? Скрипт отключает не только кнопку с изображением?
 jrummell01 окт. 2009 г., 17:04
Я могу'Мы не видим, как disableButton () может отключить что-либо, кроме того, что элемент кнопки передается ему в качестве параметра. Но похоже, что вы нашли свой ответ. Если вы все еще хотите попробовать это, дайте мне знать, что именноя инвалид, а яЯ предложу любую помощь, которую я могу.
 Meh Man12 окт. 2013 г., 10:36
ОК, но он не работает на некоторых мобильных устройствах, т.е. на устройствах с ОС Symbian
 David Archer30 сент. 2009 г., 16:28
Это похоже на то, что ям, но не совсем уверен, как с этим работать ... какие переменные мне нужно изменить для моей? Я'Я посмотрел сообщение на форуме, и оно кажется правильным, но я могуне совсем понимаю.
 David Archer01 окт. 2009 г., 15:06
Отключение больше, чем просто кнопка изображения, да.

Функция двойного щелчка является реализацией на стороне сервера, чтобы предотвратить обработку того же запроса, который может быть реализован на стороне клиента с помощью JavaScript. Основное назначение функции - предотвратить обработку одного и того же запроса дважды. Реализация на стороне сервера делает это путем идентификации повторного запроса; однако, идеальное решение состоит в том, чтобы предотвратить это на стороне клиента.

В HTML-контенте, отправляемом клиенту, который позволяет им отправлять запросы, можно использовать небольшой проверочный JavaScript-код, чтобы проверить, был ли уже отправлен запрос, и, если это так, запретить онлайн-покупателю повторно отправить запрос. Эта функция проверки JavaScript будет проверять глобальный флаг, чтобы увидеть, был ли отправлен запрос, и если да; не повторяет запрос. Если на сервере отключена функция двойного щелчка, настоятельно рекомендуется, чтобы на страницах JSP и HTML было реализовано это предупреждение JavaScript.

В следующем примере предотвращается отправка формы более одного раза с помощью действия onSubmit () объекта формы:

...

var requestSubmitted = false;
       function submitRequest() {
              if (!requestSubmitted ) {
                     requestSubmitted  = true;
                     return true;
              }
              return false;
       }

...

       
              ......
        
 Jan Aagaard21 дек. 2009 г., 11:59
Код onsubmit должен выглядеть следующим образом: onsubmit = "вернуть submitRequest () ".

Я решил это, установив скрытое поле на клике клиента, прежде чем попасть на сервер.

Затем на сервере я проверяю скрытое поле, и если значение, например, что-тоЛОЖНЫЙ' это может означать, что я могу или не могу действовать.

Ваш ответ на вопрос