Gå til innhold

j000rn

Medlemmer
  • Innlegg

    1 561
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av j000rn

  1. * Override OnCreateChildControls. Lag kontrollene her. Ikke i konstruktøren. Hekt deg også på eventer som OnClick, etc her. Hvis du skal ha flere kontroller som i menyen din f.eks. kan det være greit å se på OnCommand (+ properties CommandName, CommandArgument) også.

    * Ved uthenting av properties (f.eks. hvilken som er valg,etc) huske å kjøre EnsureChildControls først.

     

    Husk at kontrollen din "restarter" for hver request. Derfor må du for hver request lage alle kontroller på nytt igjen. For å bevare state i kontrollen bruk ViewState eller ControlState.

  2. Vel... du kan finne den første repeateren og bruke den istedenfor den navngitte....

     

    public void ShowMenuItems(Object sender, RepeaterItemEventArgs e)
    {
    	if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
    			return;
    
    	Repeater rep = RecursiveFindControl(e.Items,typeof(Repeater)) as Repeater;
    	if( rep == null ) throw new ArghException("Argh! En eller annen håpløs designer har fucket opp og fjernet repeateren!!!!  :@   ");
    	rep.DataSource = etc.....;
    }
    
    private Control RecursiveFindControl(Control ctrl, Type t)
    {
    	foreach(Control c in ctrl.Controls)
    			if( c.GetType().Equals(t) )
    					return c;
    	foreach(Control c in ctrl.Controls)
    	{
    			Control res = RecursiveFindControl(c, t);
    			if( res.GetType().Equals(t) )
    					return res;
    	}
    	return null;
    }

     

    Ikke testet, men om det er noen småfeil klarer du nok å fikse dem selv.... :thumbup:

     

    btw; Se på koden min og se at jeg snur om på den første IF setningen og bruker return. Ved å gjøre det på denne måten vil du få mer ryddig og lesbar kode.

  3. Vennen min som hjelper meg kan kun 2005

    2005/2008 er jo prikk like... :roll:

     

    Ikke når det gjelder coding, tror jeg..

     

    Jo. Det er noen tillegg i 2008, men man må ikke bruke det nye. Å jobbe på samme måten som man gjorde i 2005 går helt fint.

     

    Uttalelsen vitner egentlig om at vennen din kan ganske lite, tror jeg.

  4. Send med URL'n som skal redirectes tilbake til i querystring.

    eller...

    Response.Redirect( Request.UrlReferrer, false );

    Men referer er valgfritt for browseren å sende, så jeg ville heller brukt den første metoden...

     

    btw; det er god vane å bruke "false" som parameter i Redirect. Da vil det ikke bli kastet en ThreadAbortException(?) på serveren.

  5. Å lagre hele siden (med kontroller og alt mulig) i Session blir bare tøys. Bruk heller eksempelet mitt fra igår, eller gjør sånn som dette:

    internal class MyState
    {
     private MyState() //private slik at den ikke får lages utenifra.
     {}
    
     // En haug med properties her (private field + internal property).
    // ....
    
    internal void SaveState()
    {
    	 HttpContext.Current.Session["MyState"] = this;
    }
    
    internal static MyState GetState
    {
    	 get
    	{
    		   return (HttpContext.Current.Session["MyState"] as MyState) ?? new MyState();
    	}
    }
    }

  6. Providere som er støttet allerede:

    * Inproc (IIS ram) - default - Raskeste, skalerer ikke, forsvinner ofte på grunn av restart av IIS worker process. Bør ikke vare for lenge (default 20 min) på grunn av at det bruker minne.

    * State Server (iIS ram på en annen maskin) - Treigere, skalerer litt, forsvinner kun hvis serveren restarter.

    * SQL Server - Treigest, skalerer bra. Kan sette til å vare "uendelig" om du ønsker.

     

    I tillegg kan du programmere dine egne. F.eks. XML filer ja, selv om det hørtes utrolig lite effektivt ut... :p

  7. Jeg sa som default så kjører Session på IIS. Du kan også sette opp en separat IIS server som alle de andre bruker for å lagre sessions, eller du kan bruke SQL Server som session state server.... Du kan tilogmed lage din egen Session state provider hvor du selv velger hvordan objektene skal lagres :)

     

    Poenget er at man har mange valg, og det kanskje lønner seg å tenke litt igjennom fordeler og ulemper før man setter igang :)

     

    Uansett så lenge du har abstrakther "Session" koden ut i 1 fil som i første eksemplet mitt så blir det jo enklere å evt. forandre i fremtiden.... + de andre fordelene jeg nevnte.

  8. Du nevnte at jeg kunne lage STATIC variabler og at dette ville bli delt med hele applikasjonen på tvers av brukere? Betyr dette at jeg f.eks. kan lage en statisk LIST<> som inneholder eksempelvis påloggede brukere som vil kunen ses av alle som ser på siden?

     

    Jepp. Men litt avhengig av hva du skal bruke det til ville jeg heller vurdert å bruke en database. Husk at IIS kan finne på å "resirkulere" web'n din, den kan kræsje, etc. I tillegg er static per. maskin, så om du skal bruke load-balancing senere kan det være et problem.

  9. Som default ligger Session i RAM i IIS, slik at det ikke trenger å bli serialisert.

    ViewState blir automatisk serialisert for deg.

    Om du skal legge objekter i cookies, hidden felter, sende over nettverket, lagre i fil eller database, etc så kan du serialisere dem (til XML eller binær).

     

    Alt kan puttes i Session ja. Greit å unngå å putte kontroller der, objekter som har åpne ressurser (database, fil, nettverk, etc --- egentlig alt som implementerer IDisposable), eller data som tar veldig mye minne.

  10. Betyr det at et objekt umulig kan leve mellom to web sider?

     

    Objektene dine kan leve i f.eks. Session , Application (obsolete - bruk static), static, cache, filer, databaser, på andre maskiner, på browseren, etc. Men de kan ikke leve "mellom to web sider" nei...

     

    ViewState kan brukes for å lagre objektet, sende det til browseren, som sender det tilbake, og lastes av ASP.Net igjen. Men det fungerer kun ved postback på samme side.

  11. For hver eneste postback kan du se det som om applikasjonen starter på nytt. Derfor må alle objekter instanseres på nytt og verdier settes inn. Mye av dette gjør ASP.Net for deg automatisk, men uansett kan det være greit å tenke seg at du lager et Windowsprogram og for hver knapp du trykker på eller dropdownboks du endrer så avsluttes programmet og starter på nytt - og alt må lastes inn igjen... Nesten slik fungerer ASP.Net under panseret.

     

    Du kan sende verdier/"objekter" mellom 2 postbacks/sider. Her har du 3 måter å gjøre dette på; Form post, querystring og cookies (+ andre som ikke blir brukt så ofte - headere, andre post typer, etc).

     

    Ikke så mange valgmuligheter som du ser ;) Session er egentlig bare en cookie som refererer til en viss sted i minnet(/fil/sql server,etc).

     

    Med de 3 måtene kan du serialisere objekter og sende dem mellom sidene. ViewState/ControlState gjør dette automatisk for deg innenfor 1 side.

  12. Session er trygt ja.

     

    Du kan lage static variabler i ASP.Net også, men husk at "applikasjonen" din vil være delt mellom alle brukerene, så i dette tilfellet vil det ikke være hensiktsmessig.

     

     

    Et lite tips; ALDRI bruk "Session" i koden din.

    Dvs; Koden din == på enkelt sider.

     

    Lag heller en "wrapper" klasse, f.eks. Sikkerhet;

     

    internal class Security
    {
     private Security() // Så kan ikke klasse opprettes andre steder
     {
     }
    
     // TODO : Add errorchecking/etc...
     internal static int UserID
     {
    get
    {
    	return HttpContext.Current.Session["UserID"];
    }
    set
    {
    	HttpContext.Current.Session["UserID"] = value;
    }
     }
    
     internal static int Email
     {
    get
    {
    	return HttpContext.Current.Session["Email"];
    }
    set
    {
    	HttpContext.Current.Session["Email"] = value;
    }
     }
    }

     

    Dermed kan du bruke Security.UserID / Security.Email overalt i koden din. Dermed unngår du at du skriver Session["SkriveFeilInniHer"] i koden din. Denne typen feil er ofte veldig vanskelige å finne ut av å debugge. Dessuten blir session variablene dine type-safe, og du får mindre kode...

     

     

    btw; Det kan være en god vane å bruke public/internal/private ordentlig fra begynelsen av. Det gjør det utrolig mye enklere når du evt. skal Obfuscate prosjektet ditt senere.

×
×
  • Opprett ny...