21. august 2004 - 11:11Der 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>"
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>
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 }
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 ?!
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".
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.
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 :
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 :)
Du kan gemme på helt samme måde i application... bare tage den samme property og skift Session ud med Application. mvh
Synes godt om
Ny brugerNybegynder
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.