Avatar billede mach3 Nybegynder
08. januar 2005 - 21:08 Der er 9 kommentarer og
1 løsning

Kontrollere bruges id: Page_Load eller OnInit?

Hej,

Jeg har en base klasse som i sin OnInit har en metode som laver et database kald og ser om brugeren er admin eller om han er almindelig bruger - dette gemmes i (bool) variablen bIsAdmin.

Der loades to forskellige navigationsmenu (Page.LoadControl) alt efter om bIsAdmin er sand eller om den er falsk. Admin har selvfølgelig nogle flere funktioner end en almindelig bruger.

Så allerede i base klassen ved man, hvilken slags bruger der er tale om. Alle klasser som arver ned fra base klassen har deres egne Page_Load og OnInit metoder.

Hvis man nu som almindelig bruger i IE skriver www.testApplikation/adminFunktioner.aspx skal han jo sef ikke have lov til det.

Variablen som indeholder om man er admin eller ej er fulgt med fra base klassen, så man kan anvende denne til at tjekke om personen har adgang til siden.

Men hvor vil i foreslå at man tjekker det, i Page_Load eller OnInit eller på en helt tredje måde? Jeg ved godt at OnInit bliver udført før Page_Load, så hvis det står til et valg i mellem de to bliver det OnInit - jo før man finder ud af at personen forsøger noget han ikke må, jo bedre vel.

Håber det giver mening :-)
Avatar billede mach3 Nybegynder
08. januar 2005 - 21:10 #1
Lige nu har jeg placeret det på følgende måde i alle de nedarvede klasser:
override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
            if(bIsAdmin == false)
            {
                Response.Redirect("http://www.google.com");
            }
        }
Avatar billede snepnet Nybegynder
08. januar 2005 - 22:53 #2
det kan der vel egentlig ikke svares på - det væsentlige er at du udfører forespørgslen inden du eksekverer kode der forudsætter kendskabet til brugerens rolle, hvilket igen vil at du - når det ligger på basen - bare skal eksekveres så tidligt som muligt (altså under initialiseringen).

et alternativ kunne være at du i din base implementerer det som en property som i getteren sørger for at lave checket (eventuelt kun én gang - uafhængigt af hvor mange gange der spørges af performancehensyn).
på den måde kan du spørge når du har lyst i dine specialiserede sider - uden at spekulere på hvorvidt det er i load eller init.
(og uden at skulle spekulere over hvorvidt du kører basens implementering før din egen - eller omvendt).

der er indbygget nogle ting til den slags i forvejen.... har du overvejet at bruge det istedet ?
det er implementeret på en lidt anden måde - f.eks. kommer du til at lave forespørgsler som if(User.IsInRole(...)) istedet.

mvh
Avatar billede mach3 Nybegynder
09. januar 2005 - 02:14 #3
Hej snep -

"og uden at skulle spekulere over hvorvidt du kører basens implementering før din egen - eller omvendt"

Jeg har følgende klasse:
public class PageTemplate : System.Web.UI.Page
Denne klasse har en OnInit og det er her at jeg laver databasekaldet for at finde ud af hvilken slags bruger der er tale om.
protected override void OnInit(EventArgs e)

Ude i de enkelte klasser, her er et eksempel:

public class MyProfile : Test.Code.PageTemplate

er der også OnInit metoder
override protected void OnInit(EventArgs e)

den eneste forskel på OnInit i base klassen og OnInit i de nedarvede klasser er at der er byttet om på override og protected - det har vel ikke nogen betydning?

Men kan jeg ikke være sikker på, at OnInit i base klassen altid vil blive kørt før OnInit i de nedarvede klasser?

Mvh
Avatar billede snepnet Nybegynder
09. januar 2005 - 02:22 #4
nej den bliver kørt pr. direkte kald (base.OnInit(e);).
det er et override du laver - og det betyder så, at du aldrig vil få kaldt basens implementering med mindre du gør det selv.
mvh
Avatar billede mach3 Nybegynder
09. januar 2005 - 02:36 #5
Ok, så jeg behøver faktisk ikke at have OnInit metoder i de nedarvede klasser - de skal ikke kunne noget ekstra i forhold til base klassen nemlig. Troede bare at det var et must.

Jeg behøver vel heller ikke at bruge override i base klassen:
protected override void OnInit(EventArgs e)
?
Avatar billede snepnet Nybegynder
09. januar 2005 - 02:39 #6
jo det bør du have - OnInit(EventArgs e) er defineret på Control, og Page er en specialisering af TemplatedControl som igen er en spicialisering af Control.
- du ender altså i sidste ende på Controls implementering af OnInit().
mvh
Avatar billede mach3 Nybegynder
09. januar 2005 - 02:45 #7
snep - ok tak - nu har jeg fået lidt at tænke over - også i den anden tråd med exception handling.

takker :o)
Avatar billede snepnet Nybegynder
09. januar 2005 - 02:46 #8
velbekomme... vil du have et svar her ?
mvh
Avatar billede mach3 Nybegynder
09. januar 2005 - 02:50 #9
Ja, ok men jeg har nok flere spørgsmål i morgen, men så laver jeg en ny tråd :o) Du er jo total asp.net ekspert :-)
Avatar billede snepnet Nybegynder
09. januar 2005 - 02:55 #10
jeg har brugt det noget tid, men der er mange der er vaksere :o)
men bare spørg løs - jeg svarer på det jeg kan i denne kategori, når jeg altså sidder ved orglet, og har tid :o)
mvh
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