Avatar billede karl-koder Nybegynder
08. januar 2008 - 14:42 Der er 16 kommentarer og
1 løsning

Aktivere kode når side forlades ?

Hejsa,

Jeg har lavet noget lås af records der er i brug men mangler lige at kunne fjerne denne lås når/hvis en side forlades.

Hvor/hvordan bære jeg mig ad med det ?
Avatar billede melieha Nybegynder
08. januar 2008 - 14:55 #1
Du kan godt via javascript lave noget smart, MEN, du kan jo ikke være sikker på at brugeren får aktiveret det script. Den mest stabile løsning jeg lige kan komme på ville være at få brugeren til at sende et signal med jævne mellemrum (Eksempelvis hvert minut), for at bekræfte at denne stadig er på siden, og hvis der ikke er blevet modtaget et signal, så frigives.

En oplagt løsning ville være at lave noget ajax som bare kører stille og roligt i baggrunden uden at brugeren mærker til det (I modsætning til ex. En iframe som vil give lidt lyd fra sig og lignende).
Avatar billede karl-koder Nybegynder
08. januar 2008 - 15:15 #2
Ja det anede mig at jeg skulle ud i noget ajax/javascript som jeg ikke er så stærk i.

Kan du komme et eksempel ?
Avatar billede melieha Nybegynder
08. januar 2008 - 15:21 #3
Ikke noget direkte, men du kan kigge på eksempelvis ajax scripts som laver banner rotation (Hvilket nok er lidt overkill, og kan garanteret laves nemmere), eksempelvis: http://www.phpied.com/ajax-banner-rotation/ Som er temmelig nem og til at gå til uden javascript viden.

Så er det jo bare et spørgsmål om at lave en serversideløsning til at håndtere det, jeg ved ikke om der er nogle smarte metoder, men i sidste ende kan man jo bare opdatere databasen med en "sidste reload", og så næste gang en bruger forsøger at tilgå de berørte data, checkes der op på hvornår sidste sideload skete :)
Avatar billede karl-koder Nybegynder
08. januar 2008 - 15:27 #4
Ja ellers tror jeg faktisk dette kan bruges :

<script language="JavaScript">
  window.onbeforeunload = confirmExit;
  function confirmExit()
  {
    //--- Noget serverside kode der fjerner lås fra record.
  }
</script>
Avatar billede arne_v Ekspert
08. januar 2008 - 15:27 #5
Man kan aldrig stole paa at noget client side JavaScript vil blive koert.

To forskellige server side tilgange:

1)  put kode i global asax session end som releaser alle brugerens laase

2)  put et timestamp paa laasen og sig at kun laaser der er mindre end X minutter
    gamle er gyldige
Avatar billede karl-koder Nybegynder
08. januar 2008 - 15:42 #6
arne_v >> Nej jeg har også lige lavet en mini test og det virker ikke i alle browsere og folk der ikke har javascript aktiveret ville heller ikke trigge scriptet.

Session End i global asax er allerede lavet så jeg må smide en timer på som du forslår og så må brugerne af systemet have lidt diciplin ;o)
Avatar billede arne_v Ekspert
08. januar 2008 - 15:51 #7
Og det virker ikke med nogen browsere hvis stroemmen gaar paa client PC !

Lad Session End loebe tabellen igennem og fjerne laase for den session som
er timet ud.
Avatar billede thomas_yde Nybegynder
08. januar 2008 - 17:23 #8
desuden skal man være opmærksom på at window.onbeforeunload bliver også kaldt ved postbacks. Derfor er arne_v's kommentar den bedste løsning efter min smag.
Avatar billede karl-koder Nybegynder
10. januar 2008 - 12:14 #9
Hvad siger i til en løsning hvor man ligger et skjult iframe på en side, der kalder en Refresh.aspx side.

Refresh.aspx siden har så henholdsvis en meta refresh og et javascript til refresh.

På den måde kan jeg så lave en session med et array indeholdende de fornødne oplysninger på den løste record.

Vil gerne høre jeres meninger om dette ;o)
Avatar billede arne_v Ekspert
11. januar 2008 - 02:58 #10
Ikke forstået.

Den almindelige side laver vel en session.
Avatar billede karl-koder Nybegynder
18. januar 2008 - 18:02 #11
Ok jeg har haft lidt mere td til at kigge på det og fandt frem til at jeg kunne bruge følgende AJAX :

<asp:ScriptManager id="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Timer id="Timer1" runat="server" OnTick="Timer1_Tick" Interval="30000"></asp:Timer>
<asp:UpdatePanel id="UpdatePanel1" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
    </Triggers>
</asp:UpdatePanel>

Det der sker her er at jeg sætter en timer som tricker en serverside metode hver 30. sekund. I min kode har jeg så lavet følgende :

protected void Timer1_Tick(object sender, EventArgs e)
{
    Session["LockTime"] = DateTime.Now;
}

Men når jeg på en anden side forsøger at trække den session jeg laver ja så vises der ikke noget.

Nogen ideer der ?
Avatar billede arne_v Ekspert
19. januar 2008 - 04:56 #12
Hvad er formålet med den kode ?  ASP.NET holder jo allerede styr på session.
Avatar billede karl-koder Nybegynder
19. januar 2008 - 12:52 #13
Ja det er jeg med på men med denne løsning har jeg mulighed for at kunne fjerne en lås på en record i databasen inden for x antal sekunder.
Avatar billede karl-koder Nybegynder
20. januar 2008 - 03:19 #14
Jeg har lavet en metode der fjerner alle låse på en bruger og kalder så den metode i session_end i global.asax filen men de låse der måtte være bliver ikke fjernet hvilket virker lidt underligt hvad kan dette skyldes ?
Avatar billede karl-koder Nybegynder
20. januar 2008 - 03:20 #15
Ps. koden virker fint hvis jeg kalder den fra f.eks en side.
Avatar billede karl-koder Nybegynder
25. januar 2008 - 16:23 #16
Jeg kom frem til at jeg sætter 3 session på min edit.aspx side :

Session["LockTable"] // Tabel i database
Session["LockTime"] // Dato og klokkeslet
Session["LockId"] // Unik id fra tabel

// Metode der sætter eller fjerner lås på record
LockRecord(int Id, int UserId, string Tablename, bool LockRecord)

I page_load på min masterpage laver jeg så følgende :

//--- Laver variabler med session data.
string lockTable = (string)Session["LockTable"];
DateTime sessionTime = Convert.ToDateTime(Session["LockTime"]);
int lockId = Convert.ToDateTime(Session["LockId"]);

//--- Laver variabler med dato og den aktuelle sti
DateTime currentTime = DateTime.Now;
string path = Request.Path.Substring(Request.Path.LastIndexOf("/") + 1);

//--- Hvis ikke den aktuelle side er Edit.aspx tjekkes session variabler.
if (!path.Contains("Edit.aspx"))
{
    //--- Hvis lockTable indeholder noget og nuværende tid er større end
    //--- sessionTime slettes den lås der er lavet på en given record.
    if (lockTable != null && currentTime > sessionTime)
    {
        LockRecord(Convert.ToInt32(lockId), Convert.ToInt32(Session["UserId"]), Convert.ToString(lockTable), false);
        Session.Remove("LockTable");
        Session.Remove("LockId");
        Session.Remove("LockTime");
    }
}

Slutteligt rydder jeg alle låse på records i session_end i global.asax filen. Og på den måde kan jeg så helt undvære javascript.

Dette indebære også et session timeout skal sættes lavere end standart 20 min. for ikke at holde låse på records i alt for lang tid.

Hvis nogen af mener i har fortjent point for denne, må i gerne smide et svar ;o)
Avatar billede karl-koder Nybegynder
05. februar 2008 - 13:55 #17
Lukker
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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