Avatar billede nzc Nybegynder
21. august 2004 - 11:11 Der er 13 kommentarer og
1 løsning

differenteret brugeradgang på den smarte måde!

Hej!

Jeg er i gang med at lave en webapp hvor hver bruger kan enten være admin eller alm bruger. Jeg har en "menu" (en table med links til andre sider) hvor alle de ting den enkelte bruger kan, befinder sig. Men hvordan får jeg på den smarteste måde de links væk for den alm. bruger som kun admin skal have adgang til? Jeg har en attribut på min bruger og jeg er fristet til at lave noget lignende det her:

jeg har en label der hedder ændringAfNoget.

if (bruger.IsAdmin)
ændingAfNoget.Text = "<a href='xxx.aspx'>ændring</a>"

Men er det det smarteste ?!?!

NZC
Avatar billede snepnet Nybegynder
21. august 2004 - 14:25 #1
jeg synes du skal lave menuen dynamisk i din C# kode, og bygge den udfra hvilken bruger der er logget ind.
du kan så nøjes med at have et panel eller en placeholder på din form, som du så tilføjer din tabel-menu til.
f.eks.

i din aspx-kode:
<asp:Panel id="menuPanel" runat="server"></asp:Panel>

og i din c#-kode :

if(bruger.IsAdmin)
    InsertAdminMenu(menuPanel);
else
    InsertMenu(menuPanel);

private void InsertMenu(Control target)
{
  // bare et enkelt menupunkt i en tabel for at illustrere
  Table table = new Table();
  TableRow tr = new TableRow();
  TableCell tc = new TableCell();
  HyperLink hl = new HyperLink();
  hl.Text = "...";
  hl.NavigateUrl="...";
  tc.Controls.Add(hl);
  tr.Cells.Add(tc);
  tabel.Rows.Add(tr);
  target.Controls.Add(table);
}

og

private void InsertAdminMenu(Control target)
{
  // på samme måde
}

Hvad siger du til det ?
Avatar billede nzc Nybegynder
22. august 2004 - 09:28 #2
det lyder fandme smart :D

smid lige et svar :)
Avatar billede snepnet Nybegynder
22. august 2004 - 10:31 #3
ok :o)
Avatar billede nzc Nybegynder
24. august 2004 - 20:11 #4
tak for svar :)

Jeg undrer mig lidt over hvorfor min panel forsvinder når jeg opdaterer den side den befinder sig på. jeg har kaldet til InsertAdminMenu(...) placeret inde i if (!IsPostBack). Skal den virkelig udenfor således panellet genereres hver gang ?!
Avatar billede snepnet Nybegynder
24. august 2004 - 20:25 #5
hvis du sætter kontroller ind dynamisk skal du gøre det hver gang. Når du har den angivet i aspx-filen bliver den jo sådan set også sat ind hver gang.
hvis du binder data til kontroller behøver du dog ikke gøre det hver gang - indhold i tekstbokse, dropdownlister mv. bliver "husket".
Avatar billede nzc Nybegynder
24. august 2004 - 21:04 #6
hvordan binder jeg indholdet til panelet ?
Avatar billede snepnet Nybegynder
24. august 2004 - 22:16 #7
hvis du mener så du kan nøjes med at opbygge kontrollen første gang, er der er lidt forskellige muligheder der... De to hurtigere er

A) Du genererer den fuldt ud hver gang (Table kontrollen svinger sig ikke i viewstate automatisk).

B) Du bruger en kontrol der kan repopulere sig selv ud fra ViewState automatisk (DataGrid, DataList, Repeater.... )

Og en knap så hurtig :

C) Du bevarer din Table og laver din egen mulighed for (view)statemanagement.

Du skal under alle omstændigheder insætte kontrollen hver gang - men du vil så kunne nøjes med at "fylde den op" første gang en bruger hitter siden, og ved ændringer i datagrundlaget.

mvh
Avatar billede snepnet Nybegynder
24. august 2004 - 22:27 #8
For god og ordens skyld skal lige nævnes at det ikke er af performancehensyn til skal vælge en viewstate-løsning... Det er just en hurtigløber :o)
Avatar billede snepnet Nybegynder
24. august 2004 - 22:27 #9
æhh... prøver lige igen :o)

For god og ordens skyld skal lige nævnes at ikke er af performancehensyn du skal vælge en viewstate-løsning... Det er IKKE just en hurtigløber :o)
Avatar billede nzc Nybegynder
25. august 2004 - 08:32 #10
hvor store performancefordele vinder jeg ved at opbygge kontrollen en gang for alle når der er ca 10 elementer deri?

Ud fra det du skriver så tror jeg nemlig at jeg opbygger den hver gang en side loades :)
Avatar billede snepnet Nybegynder
25. august 2004 - 08:54 #11
Det kan der desværre ikke svares entydigt på.... Hvis du skal have fat i noget data i en database for at producere dit view, vil det som ofte være hurtigst hvis du sørger for at gemme disse data i Cache eller Session, og så bygge kontrollen hver gang udfra dem... Du kan også lave dig nogle singletons, som initialiseres med dine data.

Det er sjældent en fordel at hoppe hele vejen ned i basen hver gang for at hente den slags.

ViewState er det langsommeste, men på den anden side optager du mindre hukommelse på serveren, hvilket så kan give dig en højere grad af skalerbarhed.

Hvis menuen kan være forskellig fra alle brugere, ville jeg lægge datagrundlaget for den i Session, og generere kontrollen ud fra de data hver gang.

Hvis du kun har de to faste menuer ville jeg lægge dataene i Cache eller Application, og generere kontrollen ud fra dem.

Nu regner jeg med at det er relativt lidt data du bruger til at generere menuen, så for dette tilfælde kommer det nok aldrig til at betyde alverden, hvordan du gør det, og det er måske en tilpas lille og overskuelig klods, så du kan bruge den til at prøve de forskellige muligheder af.

Mht. viewstate, så giver det ofte sig selv hvornår man begynder at gå andre veje... Siderne bliver simpelthen for gumpetunge når det bliver for stort. Lang servereksekveringstid, og brugeren henter en masse KB, hvor det er meget lidt af det man kan se på siden :o)

Men... man skal jo lige huske på at det er gratis - forstået på den måde at man ikke selv skal skrive noget for at det virker.

Et eksempel på en nem "Session property" kan du lige få med på vejen :

protected DataSet SomeData
{
    get{return (object)Session["SomeData"] != null ? (DataSet)Session["SomeData"] : <default... kunne bare være null>;}
    set{Session["SomeData"] = value;}
}

Så har du snild adgang til den i resten af koden :

someMenuComponent.DataSource = SomeData;

Mvh
Avatar billede nzc Nybegynder
25. august 2004 - 09:51 #12
jeg tror simpelthen jeg vil forsøge mig med at putte dataene ned i Application for jeg har kun 2 menuer. På den måde er jeg jo fri for at oprette en session prop for hver evig eneste bruger og på den måde spare en smule mem :)

Det er ikke for at være dum eller noget men du har vel ikke lige et meget hurtigt eks på hvordan man gemmer noget i application ?! Hvis ikke så bruger jeg selv lige 10 min på at finde noget :)

Og mange mange tak for alle de gode kommentarer :)
Avatar billede nzc Nybegynder
25. august 2004 - 09:55 #13
damnit jeg havde helt glemt points :( sorry
Avatar billede snepnet Nybegynder
25. august 2004 - 10:08 #14
Du kan gemme på helt samme måde i application... bare tage den samme property og skift Session ud med Application.
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