Zamezení duplicitního stisku tl. Uložit   otázka

ASP.NET WebForms

Zdravím,

mám formulář s tlačítkem "Uložit". Po stisku se data ukládají do DB, ale mám problém s tím, že uživatel stiskne tlačítko 2x data se uloží 2x. Mohu toto ošetřit na klientské straně např. tak, že by se po prvním stisku tlačítko disablovalo? Nemáte nějaký příklad? Nevím jak k tlačítku dostat OnClientScript, resp. jak se odvolat na ID tlačítka, které se ke klientovi generuje dynamicky.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět
<script type="text/javascript" language="javascript">

function confirmSave(TextProConfirm, TextProAlert) {
    if (typeof TextProConfirm == "undefined") {
        TextProConfirm = "pokracovat";
    }
    var dotaz = confirm(TextProConfirm);

    if (!dotaz) {
        if (typeof TextProAlert != "undefined") {
            alert(TextProAlert);
        }
        return false
    }
}
</script>



<asp:Button ID="Ulozit" runat="server" Text="Uložit záznam" OnClientClick="return confirmSave('Uložit záznam?')" />

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Toto je dost obvyklý problém. Jedním z možných řešení (mimo disablování tlačítka) je třeba po stisku tlačítka vykreslit přes stránku nějaký průhledný div.

Příklad bohužel k dispozici nemám, ale problém s tím, jak dostat k tlačítku zmíněný javascript, je možné vyřešit třeba

1) pomocí nějakého (unobtrusive) jquery - tlačítku třeba nastavíte nějakou class ... o jquery je tady přímo článek od Tomáše Hercega

2) pokud je to tlačítko asp.net webcontrol, který vyvolává postback, pak byste mohl reagovat na submit celého formuláře a ne jen na konkrétní tlačítko

3) prozradíte zde, jak je tlačítko dynamicky generováno, možná příjdeme ještě na lepší variantu

Miroslav Kaděra

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vše bych řešil na serverové straně(pokud jde tedy o WebControl button) a to buďto pomocí:

1)UniqueID v databázi

2)Pomocí validace,kdy by se po odeslání dat do DB form vymazal a při dalším uložení by již form neprošel validací,tj.neuložil.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ad 1) To dost dobře nelze, data, která ukládám nejsou jedinečná. V DB je sice unikátní ID, ale to je jen v DB a ne u klienta.

ad 2) Možná by to šlo, ale co když klient stiskne tlačítko 2x ještě dřív, než se validace prvního stisku stihne na serveru provést?

Ve stávajícím stavu se po uložení provádí Response.Redirect na stránku, která jen říká "Data byly uloženy...", ovšem tento krok je nedostačující a některým uživatelů se daří data uložit 2x.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Form tam ani nemám, jsou tam dvě tlačítka, které vyvolávají postback (Kontrola zadaných dat, Uložení).

Tlačítko je klasické <asp:Button>. Původně jsem chtěl v javascriptu disablovat a nevěděl jsem, jak se odkázat na id tlačítka, když server vyrobí html dynamicky a tudíž id ani name dopředu neznám.

Zkusil jsem skript v prvním příspěvku, částečně to problém řeší, uživatel má jistotu, že tlačítko stiskl a nemusel by se o to pokoušet znovu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dle toho co píšete bych Vám spíše navrhoval se naučit základy technologie asp.net.A to hlavně validaci...

Pokud tlačítko vyvolá postback tak není co řešit.

Dále unique ID je jasné,že bude na úrovni databáze(jak jinak) a k vyřešení vašeho problému to bohatě stačí.

Nejjednodušíí ale bude v rámci postback requestu tlačítko jednoduše disablovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Form tam mít musíte, bez něj v ASP.NET nefunguje nic. Celá stránka je jeden HTML form.

Pokud tedy nemyslíte komponentu FormView, ta dělá něco jiného.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitě bych doporučoval použít unobtrusive řešení, tedy takové, které nějakým skriptem aplikujete globálnbě pro celou aplikaci (s možností ho lokálně vypnout).

Do masterpage přidejte referenci na jQuery a třeba tento skript (samozřejmě si ho upravte, tohle je jen příklad):

$(document).ready(function () {

    $("input[type=button]:not('[data-double-submit=no]')").live("click", function () {
        if ($(this).data("double-submit-clicked")) return false;   // pokud už na tlačítko bylo kliknuto, zamítnout to
        $(this).data("double-submit-clicked") = true;
    });
});
Sys.Application.add_load(function () {
    // po dokončení AJAX postbacku přes UpdatePanel vynulovat tlačítkům příznak double-submit-clicked
    $("input[type=button]:not('[data-double-submit=no]')").data("double-submit-clicked", false);
});

Píšu to z hlavy, takže možná tam bude nějaká bota. Princip spočívá v tom, že vezmeme všechna tlačítka ve stránce (live bude fungovat i na ta, která dynamicky přidáme později, např. přes update panel), vynecháme ta, která mají atribut data-double-submit="no" a pokud na ně klikneme, přidáme si přes jQuery funkci data příznak, že se na tlačítko kliknulo. Pokud už tam ten příznak je, vrátíme false, což kliknutí na tlačítko zamítne a nestane se nic.

Pokud se dokončí AJAX postback, potřebujeme, aby na tlačítka šlo klikat dál, v klientské události load tedy příznak u všech tlačítek vynulujeme.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback