[ASP.Net C#] Uitvoeren codebehind functies op aspx pagina

Pagina: 1
Acties:

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 16-02 23:04
Ik ben bezig met een website, die in meerdere talen beschikbaar moet zijn, en heb een TranslateText() functie in mijn codebehind staan die een string vertaald. Omdat ik nogal wat knoppen, labels, etc op de pagina's heb staan heb ik dus in de OnLoad een hele hoop van de volgende regels staan:
code:
1
btnUpdate.Text = TranslateText("GENERAL_BUTTON_UPDATE");

En dat voor elke label/button. Nou vind ik dat niet echt netjes, en ben meer van mening dat dit soort dingen in de .aspx pagina horen te staan (en het is nogal omslachtig als ik een label ofzo wil toevoegen of verwijderen)

Ik dacht dit op te kunnen lossen met de volgende regel:
code:
1
<asp:Button id="btnUpdate" runat="server" Text='<%# TranslateText("GENERAL_BUTTON_UPDATE") %>' />

Als ik de control in een DataGrid zet, werkt het perfect en krijg ik de juiste tekst op de knop. Als de code echter gewoon los op een pagina staat, krijg ik een knop zonder tekst, en ik krijg ook geen foutmelding, de functie wordt ook niet eens uitgevoerd.

Mijn vraag is dus simpel; hoe krijg ik wel tekst op een knop of label die buiten een DataGrid staat?

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
Ik heb wel geen antwoord op je vraag, maar voor meertaligheid kun je toch juist Globalization gebruiken; satellite assemblies enzo.

  • Flard
  • Registratie: Februari 2001
  • Laatst online: 10:54
Het kan zelfs in ASP.Net 2.0 met <%$ resource: key %>

ASP.Net QuickStarts openen je ogen :)

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

maar ook het # weghalen zou moeten werken...

het hekje betekend dat het uitgevoerd wordt on databound, en dat heb je niet op een gewone pagina..

de manier die Flard opperd is wel nog netter...

Of niet natuurlijk...


  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 16-02 23:04
Als ik het hekje weghaal, dan krijg ik gewoon die "code" als tekst op de knop, zonder dat ie uitgevoerd wordt.

Voor een volgend project zal ik zeker kijken naar die satellite assemblies, hoewel die methode ook een paar nadelen heeft denk ik.
Op het moment komt het uit een SQL Database, waar je simpel dingen aan kunt toevoegen/verwijderen, terwijl je bij die satellite assemblies bij iedere verandering alles opnieuw moet compileren, wat vooral lastig is aangezien straks mensen die geen verstand hebben van programmeren alle content toe gaan voegen en vertalen.

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

gorgi_19

Kruimeltjes zijn weer op :9

Welke ASP.Net versie hebben we het eik over?

sowieso kan je je resourcemanager ook baseren op 'text-bestanden', dus per se opnieuw compileren hoeft ook niet. Als ik het me goed herinner kan je in de constructor ook een filepath opgeven.

[ Voor 78% gewijzigd door gorgi_19 op 30-03-2006 12:06 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 16-02 23:04
Het is ASP.Net 2.0.

Ik heb het voorlopig "opgelost" (Waarom ik hier niet eerder aan gedacht heb weet ik ook niet :X ) door de code regel nu buiten de asp: tag te plaatsen:
code:
1
2
<% btnUpdate.Text=TranslateText("GENERAL_BUTTON_UPDATE"); %>
<asp:Button id="btnUpdate" runat="server" />

Mocht er toch nog iemand een oplossing weten om het direct in de asp: tag te doen, dan wil ik die wel nog graag horen :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 19:58

mulder

ik spuug op het trottoir

Zo hoort het gewoon. Het is een serverside control, dus daar kun je niet nogeens naar serverside switchen.

oogjes open, snaveltjes dicht


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

gorgi_19

Kruimeltjes zijn weer op :9

Maffe vraag wellicht, maar je gaat toch niet voor iedere woord een databasequerie doen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 16-02 23:04
Nope, die zijn gecached. Er is een globaal object dat wordt opgeslagen in de Application, die de SQL hiervoor afhandeld, en ook de woorden cached.

Verwijderd

Twilight Burn schreef op woensdag 29 maart 2006 @ 23:14:
Ik ben bezig met een website, die in meerdere talen beschikbaar moet zijn, en heb een TranslateText() functie in mijn codebehind staan die een string vertaald. Omdat ik nogal wat knoppen, labels, etc op de pagina's heb staan heb ik dus in de OnLoad een hele hoop van de volgende regels staan:
code:
1
btnUpdate.Text = TranslateText("GENERAL_BUTTON_UPDATE");

En dat voor elke label/button. Nou vind ik dat niet echt netjes, en ben meer van mening dat dit soort dingen in de .aspx pagina horen te staan (en het is nogal omslachtig als ik een label ofzo wil toevoegen of verwijderen)
Als je bij je huidige methode wilt blijven zou je ook het volgende kunnen doen.
- een (resource)lijstje maken met daarin gekoppeld het ObjectId en TranslateText-constante
vb. btnUpdate - GENERAL_BUTTON_UPDATE
- met een enumerator door alle objecten van de pagina lopen en check of object voorkomt in de lijst. zo ja -> TranslateText. Eventueel zou je deze code in een basisklasse kunnen zetten

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

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op donderdag 30 maart 2006 @ 22:46:
- met een enumerator door alle objecten van de pagina lopen en check of object voorkomt in de lijst. zo ja -> TranslateText. Eventueel zou je deze code in een basisklasse kunnen zetten
Een enumerator? :? Waarom geen hashtable / dictionary?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

das natuurlijk een detail,

de PreRender method van bv. een masterpage is daar erg geschikt voor...
al je buttons en/of labels een extra tag meegeven

code:
1
<asp:Button id="btnUpdate" runat="server" text_tag="GENERAL_BUTTON_UPDATE" />


vervolgens in die PreRender method vanaf de pagina alle controls doorlopen op die pagina en
pseudocode
if control has attribute text_tag
set text with value form text tag

nooit meer naar omkijken dan, en het zit op 1 plek

Of niet natuurlijk...


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

gorgi_19

Kruimeltjes zijn weer op :9

giMoz schreef op vrijdag 31 maart 2006 @ 09:26:
das natuurlijk een detail,

de PreRender method van bv. een masterpage is daar erg geschikt voor...
al je buttons en/of labels een extra tag meegeven

code:
1
<asp:Button id="btnUpdate" runat="server" text_tag="GENERAL_BUTTON_UPDATE" />


vervolgens in die PreRender method vanaf de pagina alle controls doorlopen op die pagina en
pseudocode
if control has attribute text_tag
set text with value form text tag

nooit meer naar omkijken dan, en het zit op 1 plek
PreRender? waarom niet load, en dan afvangen op Page.IsPostback? Je viewstate regelt de rest wel.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

omdat er na de load nog best controls kunnen bij komen e.d.

leuke aan het pre-render event is, is dat dat het 1 na laatste event is dat af gaat (de laatste is d erender) en dat er geen controls meer mogen bij komen, dus dan weet je precies welke knoppen je hebt en welke niet...

Bij de load is dat nog niet bekend, dan moe je nog events handlen van de page.... kan er nog van alles gebeuren, incl een redirect o.i.d.

Of niet natuurlijk...


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

gorgi_19

Kruimeltjes zijn weer op :9

giMoz schreef op vrijdag 31 maart 2006 @ 09:31:
omdat er na de load nog best controls kunnen bij komen e.d.
Daar hebben ze de Init / CreateChildControls voor bedacht, als mensen andere events gaan misbruiken is dat een ander probleem. Nadeel is dat een hoop mensen ook finaal de mist ingaan met hun viewstate als ze in / na de load hun controlcollection gaan aanpassen.
leuke aan het pre-render event is, is dat dat het 1 na laatste event is dat af gaat (de laatste is d erender) en dat er geen controls meer mogen bij komen, dus dan weet je precies welke knoppen je hebt en welke niet...
In principe horen er na de load ook geen controls meer bij te komen. :)
Bij de load is dat nog niet bekend, dan moe je nog events handlen van de page.... kan er nog van alles gebeuren, incl een redirect o.i.d.
Klopt, maar daarvoor heb je de viewstate; een redirect zorgt er dan niet voor dat de controls nogmaals geladen worden bij een postback. Sowieso wordt het aangeraden om de request wel te laten voltooien bij een redirect, aangezien je anders ThreadAbortExceptions kan krijgen en je dus automatisch ook een prerender krijgt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

waarom zou er na een load geen control meer bij mogen komen??

onclick van een button die zorgt dat er van een dropdownlistbox een usercontrol in een panel geladen wordt?

maar punt is:
Op een gegeven moment als je zeker weet dat er geen conrols meer bijkomen, alles doorlopen en voor alles met die extra attribuut ergens een waarde vandaan halen om daar in te zetten...

zo generiek genoeg beschreven? ;)

Of niet natuurlijk...


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

gorgi_19

Kruimeltjes zijn weer op :9

giMoz schreef op vrijdag 31 maart 2006 @ 10:21:
waarom zou er na een load geen control meer bij mogen komen??

onclick van een button die zorgt dat er van een dropdownlistbox een usercontrol in een panel geladen wordt?
En hoe zorg je er voor dat deze bij een postback nog blijft staan? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

wie zei dat dat moest ;)

je hebt wel gelijk, maar jou stelling is ook niet zeker...

Of niet natuurlijk...


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

gorgi_19

Kruimeltjes zijn weer op :9

giMoz schreef op vrijdag 31 maart 2006 @ 10:27:
je hebt wel gelijk, maar jou stelling is ook niet zeker...
Welke stelling? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

dat er na de load geen control meer bij horen te komen....

maar we verzanden in details...

of je het nou in de load of ind e prerender van d emasterpage stopt zal me natuurlijk aan m'n anus oxideren...

[ Voor 38% gewijzigd door giMoz op 31-03-2006 10:31 ]

Of niet natuurlijk...


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

gorgi_19

Kruimeltjes zijn weer op :9

Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering.
Oftewel: CreateChildControls is normaliter de plek om dynamisch controls te genereren. Doe je het later, dan heb je een redelijke kans dat je je control collection vernaggeld en dus je viewstate niet meer klopt. Controls kunnen vervolgens een nieuw ID krijgen, waardoor de postback niet meer werkt; sowieso moet je zelf controleren of alles klopt.

Als je in een click-event van een control een control dynamisch laad, vraag ik me af hoe je hier nog bij wil komen als deze control nog een postback wil veroorzaken; of hij is te laat en sowieso wordt het niet automatisch meer toegevoegd.

Ook het laden van data hoort normaliter in je Page_load te gebeuren. Maar idd, je kan van dit alles afwijken, maar dan moeten mensen ook niet verbaasd staan als er onverwachte dingen gebeuren. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

gorgi_19 schreef op vrijdag 31 maart 2006 @ 08:56:
[...]

Een enumerator? :? Waarom geen hashtable / dictionary?
Page.Controls.GetEnumerator ofzo? Omdat die al bestaat.
Pagina: 1