[ASP.NET] Vraagje over DOM

Pagina: 1
Acties:

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Topicstarter
Met hulp van een boek en veel Googelen heb ik in C# en ASP.NET 2.0 een kleine website gemaakt. In één van de pagina's van die site wordt een XML file met XSLT getransformeerd naar HTML die daarna als onderdeel van de .Aspx pagina wordt weergegeven. Op die manier kan ik content aanpassen door alleen de XML te editen.
Daarnaast heb ik in de code-behind van de pagina een routine die de elementen op de pagina naloopt en in een aantal elementen attributen toevoegt/aanpast. Zo kan ik bijvoorbeeld een fragment Javascript (onclick=... etc) toevoegen aan anchor tags die naar externe sites wijzen zonder dat ik de content daarmee moet vervuilen.

Helaas lukt dit "nalopen" alleen met elementen die in de .Aspx pagina gedefinieerd worden en het runat="server" attribuut hebben. In de code die door de XML/XSLT transformatie gegenereerd wordt heeft runat="server" echter geen effect. Nu begrijp ik dit wel maar dat maakt het niet minder lastig.

Mijn vraag dus: Hoe kan ik dit met server-side code oplossen zodat ik ook de dynamisch genereerde elementen kan aanpassen? Is er wel een oplossing? Client-side Javascript zou misschien ook wel kunnen maar die oplossing staat me tegen omdat ik dan client- en serverside code moet mengen (meer complexiteit) en ik liefst zie dat de site ook werkt zonder Javascript-enabled browser.

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Dat ligt er een beetje aan hoe je nu de transformatie uitvoert. Als je gebruik maakt van de standaard XmlDocument klassen kun je prima door je hele DOM heenlopen dmv SelectNodes en een paar XPath expressions.
Kun je een stuk code posten waar je die transformatie doet?

Nu met Land Rover Series 3 en Defender 90


  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Topicstarter
MTWZZ schreef op maandag 12 maart 2007 @ 08:55:
Kun je een stuk code posten waar je die transformatie doet?
In de aspx gebruik ik deze code:
code:
1
2
3
<ul>
    <asp:xml id="Xml" DocumentSource="Data/Default.xml" TransformSource="Data/Default.xsl" runat="server" />
</ul>


De xsl ziet er als volgt uit. De bedoeling is dat een XML tabel waar gegevens van CD's in staan omgezet wordt naar een unordered list. Vervolgens gebruik ik de code-behind om door de elementen heen te lopen. Met de statische onderdelen, die gewoon in de .aspx staan, lukt dat maar niet met de onderdelen die vanuit de XSL gegenereerd worden. Als ik naar de source van de output kijk zie ik zelfs de runat="server" attributen er nog in staan.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" encoding="UTF-8" />

    <xsl:template match="/">

        <xsl:for-each select="Albums/Album[Type='CD']">
        <xsl:sort select="Artist/Name" />

            <li>

                <a>
                    <xsl:attribute name="href"><![CDATA[Details/?Item=]]><xsl:value-of select="@id" /></xsl:attribute>

                    <xsl:attribute name="runat">server</xsl:attribute>

                    <img>

                        <xsl:attribute name="src">
                            <xsl:value-of select="Cover/@ImageSrc" />
                        </xsl:attribute>

                        <xsl:attribute name="alt">
                            <xsl:value-of select="Artist/Name" />
                        </xsl:attribute>

                        <xsl:attribute name="runat">server</xsl:attribute>

                    </img>

                    <p>
                        <xsl:value-of select="Artist/Name" />
                    </p>
                </a>

                <p><xsl:value-of select="@Title" /></p>

            </li>

        </xsl:for-each>

    </xsl:template>

</xsl:stylesheet>

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 09:27

mulder

ik spuug op het trottoir

Je bent nu wat dingen aan het doorelkaar halen. Zowel XSLT als ASP.Net genereren HTML dat door de browser wordt getoond. De runat tags zijn voor ASP.Net het teken dat het element aan de server kant kan worden aangesproken op het moment dat de pagina word aangevraagd, voordat de HTML wordt gegenereerd. Daarna word de juiste HTML gegenereerd en naar de browser gestuurd. Wat jij nu doet is die runat tags toevoegen aan de HTML die naar de browser word gestuurd; een stap te laat zeg maar. Je probeert ASP.Net serverside controls te genereren met clientside HTML komt het op neer.

Edit:
Maar de dingen die je wilt toevoegen horen dan toch eigenlijk thuis in de XSLT?

[ Voor 7% gewijzigd door mulder op 12-03-2007 22:19 ]

oogjes open, snaveltjes dicht


  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Topicstarter
Don Facundo schreef op maandag 12 maart 2007 @ 22:05:
Je bent nu wat dingen aan het doorelkaar halen.
Dat was me inmiddels duidelijk, zoals ik al aangaf :)

De vraag is nu hoe ik dan verder moet. Voor de gestructureerde data zoals ik hier uit een XML haal zijn inderdaad ook wel "echte" ASP.NET oplossingen zoals ik dat nu ook al doe met data die ik uit een SQL database haal. En zoals je al aangeeft zou ik ook in de XSLT zelf nog attributen toe kunnen voegen.

Maar ik wil in een later stadium wat complexere dingen gaan doen waarvoor de combinatie van XML+XSLT met code-behind, als die combinatie tenminste mogelijk is, veruit de meest aantrekkelijke (minst complexe) optie is.
Ik ben dus nog steeds op zoek naar een manier om de XSLT in plaats van platte tekst, die vervolgens naar de client wordt gestuurd, een correcte DOM structuur te laten genereren die ik vanuit code-behind kan bewerken voordat ASP.NET de pagina naar de client stuurt.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 09:27

mulder

ik spuug op het trottoir

Dat kan -imho- dus niet

oogjes open, snaveltjes dicht

Pagina: 1