Avatar billede jytte Nybegynder
01. februar 2006 - 23:09 Der er 12 kommentarer og
2 løsninger

forhindre dobbelt-submit

I asp kan jeg godt forhindre at dobbelt-klik giver anledning til at der indsættes to rækker i databasen. Jeg bruger bare javascript til at disable submit-knappen før der submittes. Så forhindres definitivt at brugeren får noget ud af at trykke flere gange på knappen.

Men i .Net hvor jeg er begyndt at bruge post-back-faciliteten kan jeg ikke lave et clientside-onclick på min knap:

<asp:Button id="BtnGem" runat="server" Text="Gem"></asp:Button>

Hvordan forhindre jeg så at dobbelt-klik giver dobbelt-submit???
Avatar billede arne_v Ekspert
01. februar 2006 - 23:24 #1
det man generelt goer er:
  * output tal til formen saa det submittes tilbage
  * gem tal i session
  * ved klik checker man om det indsendte tal matcher det i session, hvis ja inkrementerer
    man tallet i sessionen (kan genbruges) og udfoerer klik, hvis nej saa rejecter man

jeg ved ikke om ASP.NET har noget indbygget til dette
Avatar billede dr_chaos Nybegynder
02. februar 2006 - 22:12 #2
Avatar billede arne_v Ekspert
02. februar 2006 - 23:21 #3
er det virkeligt hvad man bruger i ASP.NET ?
Avatar billede dr_chaos Nybegynder
03. februar 2006 - 09:26 #4
Man vil bruge enten noget i den stil eller noget javascript.
du kan også gøre det på denne måde:
<asp:Button ID="Action" OnLoad="btn_load" OnClick="Action_Click" runat="server"  />
og i codebehind tilføjer du:
protected void btn_load(object sender, EventArgs e)
    {
        //script som forhindre at bruger trykker mere end en gang
        Button btn = (Button)sender;
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("this.value = 'Vent venligst...';");
        sb.Append("this.disabled = true;");
        sb.Append(ClientScript.GetPostBackEventReference(btn, ""));
        sb.Append(";");
        btn.Attributes.Add("onclick", sb.ToString());
    }
Avatar billede jytte Nybegynder
04. februar 2006 - 07:49 #5
arne_v:
Din metode der bruger session er vel kun sikker hvis optælling af sessionen er
udelelig ? hvis man er meget uheldig kan man vel tænke sig at to tråde begge aflæser sesssionen til din startværdi og derfor begge submitter !
Man kan selvfølgelig sætte application omkring optælling af sessionsvariablen, men det er jo lidt drastisk.

dr_chaos: (dit første eksempel)
Kan man ikke risikere at den timeout der er i javascriptet ikke forhindre at man kan nå at klikke flere gange ?

dr_chaos: (dit andet eksempel)
Kan du i ord forklare mig hvad der sker i din btn_load
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 09:41 #6
i
if (typeof(Page_ClientValidate) == 'function'
Ser den på om der er validators på siden.
I
("if (Page_ClientValidate() == false) { return false; }} ");
stopper den ikke siden validerer korrekt. f.eks. i tilfælde af at et felt er tomt.
I
sb.Append("this.value = 'Vent venligst...';");
Sættes knappens tekst til Vent venligst
i
this.disabled = true;");
disables knappen
I
ClientScript.GetPostBackEventReference(btn, "")
sikres det at postback med knappen udføres og at den korrekte funktion afvikles.
Til sidste tilføjes det hele til knappen som et onclick event.
Jeg bruger selv den sidste metode.

hvis du bruger asp.net 1.1 skal du muligvis ændre
ClientScript.GetPostBackEventReference
til
Page.GetPostBackEventReference
Avatar billede jytte Nybegynder
04. februar 2006 - 10:28 #7
dr_chaos:
Sikre det at knappen disables før den submitter ?
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 12:26 #8
ja
Jeg bruger det som sagt selv.
Avatar billede arne_v Ekspert
04. februar 2006 - 15:41 #9
C# har et keyword lock til at synkronisere den slags adgang

(i VB.NET hedder det SyncLock)
Avatar billede jytte Nybegynder
04. februar 2006 - 20:40 #10
arne_v:
Kræver SyncLock ikke at det kun kører på én server?
Det jeg laver skal måske køre load-balancing.
Avatar billede arne_v Ekspert
04. februar 2006 - 21:36 #11
principielt jo

men i praksis nej - fordi load balanceren boer route requests fra samme
client til samme server saalaenge serveren koerer
Avatar billede jytte Nybegynder
05. februar 2006 - 09:32 #12
Mange tak for input.
Læg lige et svar begge to.
Avatar billede dr_chaos Nybegynder
05. februar 2006 - 11:49 #13
svar :)
Avatar billede arne_v Ekspert
05. februar 2006 - 15:28 #14
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester