[ASP.Net] Uitlezen Controls van pagina's in webproject

Pagina: 1
Acties:

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 23-05 22:49
Ik heb een Webproject met een aantal aspx pagina's. Op deze pagina's staan uiteraard controls. Deze Controls kunnen gelocaliseerd worden. Voor de localisatie maken we gebruik van een 'key'-attribute, aan de hand van deze key zoeken we de tekst in de juiste taal op in een DB.
Nou heb ik het volgende probleem: Om de vertaler te helpen om de applicatie in de toekomst te vertalen, wil ik een overzicht genereren van pagina's met de controls en de keys.
Daardoor wil ik door alle pagina's in het Webproject heen lopen. Van de pagina's de Controls opvragen en kijken of deze Controls een 'key'-attribute hebben.

Ik heb op dit moment via Reflection de volgende code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim a As Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
Dim pages As ArrayList = New ArrayList
Dim tt As Type
Dim page As System.Web.UI.Page
For Each tt In a.GetTypes()
   If tt.IsSubclassOf(GetType(System.Web.UI.Page)) Then
       Dim cc As System.Web.UI.ControlCollection
       Dim pi As System.Reflection.PropertyInfo
       pi = tt.GetProperty("Controls")
                
       'hier gaat het mis
       cc = CType(pi.GetValue(tt, Nothing), System.Web.UI.ControlCollection)
               
       pages.Add(tt.Name)
   End If
Next

Nu krijg ik prima de pagina's en de Property, maar ik kan niet bij de Controls in de ControlsCollection. Ik krijg een probleem dat hij het type niet kan converteren.

Iemand een idee wat hier fout gaat of een andere oplossing?
Ik heb me helemaal suf gegoogled, maar kon dit niet vinden.

[ Voor 12% gewijzigd door Peetman op 19-08-2004 14:40 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Ehm, waarom maak je gewoon geen gebruik van de localisation functionaliteit die .NET je al biedt?
Kijk eens naar de ResourceManager class en naar de ResourceWriter class enzo.

Je kan je vertalingen in de DB stoppen, met een ResourceWriter kan je die vertalingen naar een resx file schrijven, en met de resourcemanager haal je ze in de juiste taal op.

https://fgheysels.github.io/


Verwijderd

Het probleem wordt waarschijnlijk veroorzaakt doordat de Controls collectie nog niet geinitialiseerd is. Dit gebeurd namelijk pas als je een pagina daadwerkelijk opvraagt. Op dat moment wordt de ControlCollection gevuld met de controls op een pagina.

Ik zie geen mogelijkheid om via de manier die je nu gebruikt aan de controls op een pagina te komen, wel een drietal alternatieven:

- De pagina objecten een voor een op de correcte manier instantieren en dan op het juiste moment in de page lifecycle de ControlCollection doorlopen.
- Al je pagina's zoveel mogelijk XHTML compliant maken en dan een eigen parsertje schrijven die de pagina's in een DOM laadt, waarna je de correct keys via XPath opvraagt. Omdat je de pagina's doorzoekt voordat deze door de server verwerkt zijn zul je hierbij een manier moeten vinden om de niet well-formed dingen eruit te filteren (zoals de <%@ Page.... %> 'tags', databinding 'tags'<%# %> etc).

Omdat optie 1 best ingewikkeld is, en je je kunt afvragen of je wel wilt dat iedere pagina daadwerkelijke geinstantieerd wordt, en optie 2 foutgevoelig is en nogal wat beperkingen oplegt lijkt mij de beste optie:

- Zorg dat er tenminste 1 taal in je vertalingsdb staat waarbij alle keys terugkomen (kan Bork, Bork, Bork zijn for all I care) en bouw je lijst met pagina's en keys op adhv de database.

Los hiervan: heb je ook al gekeken of de .NET standaard .resx files niet een afdoende oplossing zijn? Omdat dit wel standaard XML files zijn zou je op basis hiervan eenvoudig een lijst met te vertalen keys kunnen opstellen.

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 23-05 22:49
Misschien had dit ook allemaal idd via Resource Files gekund. Een reden waarom we hiervoor gekozen hebben, is omdat je dan ook controls in een DataGrid bv zou kunnen localiseren. (Ik ben van mening dat dat ook moet kunnen, maar collega's kunnen soms nogal eigenwijs zijn)

Ik ben overigens wel weer wat verder gekomen. Ik roep nu via Reflection de constructor aan en kan dan wel bij de ControlCollection en zoals paullooijmans al opmerkte is die nog leeg. Ik ga dus nu kijken of ik verder kan komen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Je zult in de pre_render event die localisatie moeten doen.

https://fgheysels.github.io/


  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 23-05 22:49
whoami schreef op 19 augustus 2004 @ 16:41:
Je zult in de pre_render event die localisatie moeten doen.
Dat klopt. De localisatie werkt ook wel. Ik wil alleen een overzicht creeren van alle pagina's/controls met een bepaald attribute.
Pagina: 1