[ASP.NET C#] Communicatie tussen usercontrols

Pagina: 1
Acties:

  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Ik heb een pagina met 2 usercontrols: login & content.
Die content is standaard niet visible en moet visible worden als er bij login is "ingelogd".
Hoe kan ik vanuit login aangeven dat content visible moet worden?

  • thegve
  • Registratie: Februari 2004
  • Laatst online: 13-05 23:53
content.visible = true; ?

  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Nee, dat gaat niet werken.

Deze code werkt in de index.aspx
code:
1
2
3
4
5
Control contentControl = FindControl("Content");
if(contentControl != null)
{
   contentControl.Visible = true;
}


Maar nu wil ik het werkend hebben in de login-usercontrol.
Wanneer ik deze code uitvoer in de login-usercontrol, kan de content-control (logischerwijs) niet worden gevonden...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Kan je geen event maken in je login user control OnLoggedIn oid, dat getriggerd wordt als je ingelogged bent?

Die event vul je dan op in je Page class zelf, en in de event check je dan nogmaals of de gebruiker wel ge-authenticeerd is, en indien dit zo is, dan zet je de visible property van de content user control op true, en anders op false.

https://fgheysels.github.io/


  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Dit gaat nog een beetje te ver.
Kan je me wat op weg helpen?
Hoe moet ik een event creeeren?

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Ik vind zelf de Event methode het mooist, anders zou je misshcien gebruik kunnen maken van de Observer design pattern.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Ik weet niet of je dat observer pattern zo makkelijk kunt implementeren in een webform....

Je kan in je user control een property maken die een bepaalde delegate verwacht.
Als je ingelogged bent, fire je dan die delegate als er ingelogged wordt.

Ik heb niet zo'n ervaring met web based applicaties, maar hier vind je een voorbeeldje van delegates in WinForms:
[rml]whoami in "[ VB.NET] waardes van een andere form?"[/rml]

[ Voor 10% gewijzigd door whoami op 08-07-2004 13:27 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Je kan het misschien zo doen (pseudo code en ingekort, aangezien ik niet veel zin heb :P )

In je user-control neem je een property op van het type EventHandler
code:
1
public EventHandler OnAuthentication;


In je page ga je die OnAuthentication property van je user control initialiseren:
code:
1
myUserControl.OnAuthentication += new EventHandler(DoSomethingWhenAuthenticated);


DoSomethingWhenAuthenticated is een method die je in je Pagina zelf gedefinieerd hebt, en die kan er bv zo uit zien:
code:
1
2
3
4
5
6
7
8
9
10
11
private void DoSomethingWhenAuthenticated(object sender, EventArgs e)
{
    if( User.IsAuthenticated)
    {
        contentUserControl.Visible = true;
    }
    else
    {
         contentUserControl.Visible = false;  
    }
}


In je authentication-user control ga je, deze code opnemen bij de login-logica:

code:
1
2
3
4
if( OnAuthentication != null )
{
    OnAuthentication(this, EventArgs.Empty);
}


Disclaimer: het is maar een idee, ik heb het niet uitgetest, en ik weet ook niet of dit zo maar werkt in Webforms. :P

https://fgheysels.github.io/


  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Ok, ik begrijp je bedoeling. Bedankt :)
Ik krijg het alleen nog niet werkend....

Ik ga hier morgen weer met een frisse blik naar kijken....
Is trouwens wel een ingewikkelde structuur. Zou er niet iets makkelijkers zijn?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

Nog makkelijker zou zijn:
Visual Basic .NET:
1
contentUserControl.Visible = User.IsAuthenticated

Maar dat komt neer op bovenstaand :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Ik heb het idee dat ik er bijna ben....

Teneerste heb ik in index.aspx het volgende gedaan:
code:
1
2
3
4
5
//login is de usercontrol
login log = new login();

//even testen
Response.Write(log.LoggedIn);


En in mijn login-usercontrol staat:
code:
1
2
3
4
5
6
7
8
9
10
11
public bool LoggedIn
{
    get
    {
        return false;
    }
    set
    {
        Session["loggedin"] = value;
    }
}

Wanneer ik bovenstaande doe, krijg ik netjes FALSE op mijn scherm.
Maar doe ik dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public bool LoggedIn
{
    get
    {
        bool temp = false;
        if(Session["loggedin"] != null)
        {
            temp = Convert.ToBoolean(Session["loggedin"]);
        }
        return temp;
    }
    set
    {
        Session["loggedin"] = value;
    }
}

Dan werkt het niet meer en krijg ik de volgende error:
Object reference not set to an instance of an object.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

WTF????

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Debug eens.
Zet een breakpoint in je code, en kijk waar het mis gaat.

https://fgheysels.github.io/


  • marco_balk
  • Registratie: April 2001
  • Laatst online: 15-05 13:37
Het probleem zit 'm in:
code:
1
if(Session["loggedin"] != null)

Daar blijft ie op z'n bek gaan. Terwijl ik iets terug in mijn code (in de Page_Load) dezelfde statement gebruik.
Kan dit te maken hebben met het feit dat de usercontrol nog niet "geladen" is? En hoe is dit te omzeilen?
Ik heb het geprobeerd met Page_Init(), maar helaas werkte dit ook niet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:18
Ik denk dat je slechts vanaf de PreRender je user controls kunt benaderen.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

DAn moet je dus HttpContext.Current.Session ipv Sessen gebruiken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1