1. Precis som du gissade. Iterera.
2. Det går finfint, men du måste lägga med @Register-direktiven i strängen som du skickar in i ParseControl
8 svar · 704 visningar · startad av ordell
Nu ska vi se...
Jag sitter och pillar lite med XML och XSLT-transformeringar i ASP.NET (C#). Vad jag vill göra är att jag vill använda serverkontroller i XSLT-mallen. Genom att lägga till en namespacedeklaration i xsl:stylesheet-deklarationen (med xmlns:asp="bla bla..") och sedan använda ParseControl() med resultatet av transformeringen har jag lyckats få XSL att känna igen .NET-kontroller som <asp:button> osv. Fint och trevligt. Dock har jag inte (ännu) lyckats klura ut hur jag attachar serverside events som oncommand osv än, men jag antar att det räcker att köra en rekursiv iteration över alla kontroller som existerar i kontrollen och langa på Events(?).
Vad jag skulle vilja göra mer är att använda mig av egna usercontrols för att göra färdiga komponenter att använda i XSLen. När jag har lagt till ett eget namespace (Vi kan kalla det foo) och en kontroll (bar) så får jag fel när jag försöker inkludera UCn (<foo:bar id="bar1" runat="server" />)
Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.
Parser Error Message: Unknown server tag 'foo:bar'.
Alltså:
1. Precis som du gissade. Iterera.
2. Det går finfint, men du måste lägga med @Register-direktiven i strängen som du skickar in i ParseControl
Lysande! Tack för hjälpen!
Och som jag misstänkte så får jag med UC:ns events när jag inkluderar den :birp
Hm, jag sprang på ett annat litet problem nu...
Enligt ASP.NETs så måste ju UCs instansieras i Page_Init för att kunna få med alla events för respektive kontroll, right? Det innebär ju i praktiken att all transformering av datan för att kunna använda egna kontroller i XSLT måste ske i Page_Init.
Vi föreställer oss att vi utvecklar en "varukorg". Användaren klickar på "lägg till varan i din korg" varpå ett objekt i en sessionsvariabel uppdateras. Då måste det göras en ny populering av XML-källan som sedan måste transformeras igen ut till klienten = events på knappar binds i ett senare skede än Page_Init.
Detta är ju mer eller mindre ett välkänt problem. Är den enda lösningen att göra en Redirect till sidan igen för att få upp ny data?
Ursäkta men en liten parentes... går det att använda asp.net-kontroller i en xslt? Exakt hur har du gjort det!?
inspiro skrev:
Ursäkta men en liten parentes... går det att använda asp.net-kontroller i en xslt? Exakt hur har du gjort det!?
Se mina tidigare inlägg ;)
Egentligen är det så pass enkelt att man transformerar XML mha XSLT och sen parsar koden med ASP.NET-motorn (lite förenklat). Det är mer eller mindre samma förlopp som ASP.NET gör med koden som finns i din ASPX-fil.
Ta en titt på ParseControl() som parsar HTML/ASPX till en System.Web.UI.Control
Hm, jag har läst men fattar inte ändå. En xsl är väl ett sätt att layouta xml, elelr har jag fel? Menar du att man kan göra så här:
<xsl:template>
<asp:button runat="server" />
</xsl:template>
Var skriver jag koden?
Nejdå, det stämmer mycket bra att man använder XSL för att transformera XML, antingen till HTML eller något annat format (om man vill).
Och det är precis det jag menar. Man KAN använda ASP.NET komponenter som <asp:button /> eller t.o.m. egna usercontrols (<foo:addtocartbutton />) med egna events och attribut.
ordell skrev:
Detta är ju mer eller mindre ett välkänt problem. Är den enda lösningen att göra en Redirect till sidan igen för att få upp ny data?
Hmmm...lite knepigt, men det kan funka.
1. Page_Init - läs in kontrollen (baserad på sessions-data) och spara referensen till den
2. OnClick på en knapp i kontrollen - läs in kontrollen igen, med uppdaterad data. Ta bort den gamla (flera millisekunder gammal) kontrollen och ersätt med den nya.
Glöm inte att sätta id:n på alla genererade kontroller