webForumDet fria alternativet

Spara layout i en databas?

.NETur .NET

10 svar · 437 visningar · startad av Jmc

JmcMedlem sedan aug. 200249 inlägg
#1

Hej
Jag har en intresant fråga.
Anta att jag vill ha min sidlayout i en databas, dvs all htmlkod, eller iaf mellan formtaggarna.
För att inte gå in på en massa dataljer så antar vi att jag vill att alla textboxar med id "apa" ska det stå "kamel" i.
Denna koden ligger i code behind.

I databasen finns koden:
<asp:TextBox id="apa" runat="server"></asp:TextBox>

Jag vill alltså att sidan ska läsa layouten från databasen.
Skriva ut den på sidan och sedan ska codebehind ta över och ändra så att värdet i "apa" blir "kamel".

Jag vet hur jag kommer åt objekt som som inte är instancierade i codebehind, det luriga i detta är att få asp.net att tolka koden i databasen som object plötsligt.

Jösses vad krångligt det låter, hoppas ni förstår.

Är det någon som har gjort detta eller har några ideer hur?

/Jimmy

asmodieMedlem sedan jan. 2004501 inlägg
#2

Hmz....låter inte som en bra lösning. Men använde mycket css...du kan ju göra sidan nästan helt med css och sedan lagra css:en i databasen.

JmcMedlem sedan aug. 200249 inlägg
#3

Hej
Jag vill ha hela sidan fullkomligt dynamsik, dvs att jag ska kunna ändra layouten fullkomligt.
Beroende på olika in parametrar ska den kunna ha vilket utseende som helst, inte bara css stilat.

Jag misstänker att det inte ens går att göra.
Men jag skulle vilja veta det säkert innan jag implementerar att alternativ som jag inte är lika nöjd med.

/Jimmy

renholmMedlem sedan apr. 20012 266 inlägg
#4

Kika på IBuySpyPortal för att få lite idéer om hur man kan bygga sin sida dynamiskt med ett modulsystem.

GladhMedlem sedan maj 20012 812 inlägg
#5

Hur hade du tänkt egentligen?

Om du har din textbox i Databasen, så måste ju din codebehind också skapas dynamiskt, eller menar du att du har en codebehindTemplates som skapar sidor till dig utifrån data som finns i databasen.

Om du menar det första så måste du skapa både ASPX-sidan samt din CS-sida och sedan kompilera din CS-sida (för prestanda). Det finns en assemnly just för att skapa och kompilera kod i runtime. Emit heter det.

Om du har en TemplateCodebehind som skall lägga in din Textbox på sidan från en databas, så är det inte speciellt svårt. Du kan dock inte spara ner koden:
<asp:TextBox id="apa" runat="server"></asp:TextBox>

utan får spara ner följande information.
- Typ av kontroll: Textbox.
- Id:et på kontrollen: kamel (varför spara ner Apa om det ändå skall bytas)
- classnamn,
- position på sidan.
osv osv

När du har denna information så kan du skapa ett nytt TextBox object i din codebehind och fylla på dessa propertys som du behöver.

- Magnus

JmcMedlem sedan aug. 200249 inlägg
#6

Ja det har jag vart inne på också men jag vill inte ha grid på sidan utan flow.
Så det funkar inte riktigt.

Jag har gjort kod för att kunna lägga till en datalist i aspxkoden (inte deklarerad i codebehind)
Sedan loopar jag igenom alla controls i page.controls och fyller datalisten med data från ett dataset.

jag vill alltå utan att kompilera om något kunna spara layouten med alla kontroller i en databas och enkelt kunna få upp den igen.

Jag börjar tror att just denna lösningen är omöjlig, jag har inte kollat på IBuySpyPortal ännu den kanske har lösningen.

/jimmy

JmcMedlem sedan aug. 200249 inlägg
#7

Tyvärrså löste inte ibuyspyportal problemet, den är himla smart, men fortfarande för krångligt och kräver att man har .net.
Det jag skulle vilja ha är ett enkelt gränsnitt som en "vanlig" ;) människa klarar av, där man kan ändra layout.

Ska kolla vidare lite, annars verkar det inte bättre än att jag får lägga ner detta tänket..

/Jimmy

JmcMedlem sedan aug. 200249 inlägg
#8

Kan man inkludera en aspx sida som exekveras först?
Alltså en sida som hämtar all html från en databas och som sedan includeras i en annan sida?

/Jimmy

GladhMedlem sedan maj 20012 812 inlägg
#9

Du kan lösa samma sak med flow. Du låter bara bli att sätta några positionsmarkeringar så kommer det ju att flöda precis som om du bara skriver det direkt i HTML-koden.

Jag vet precis hur du tänker eftersom jag varit inne på något liknande (försökte efterhärma en applikation för CRM som jag har lekt lite med) och det byggde på både position och flows...

Man bygger upp sidan med olika panels och dessa har man flow på och kan bestäma hur höga och bredda de är, samt var i flödet de skall placeras. I dessa paneler så sätter man de olika kontrollerna med absoult placering.

Jag har svårt att tro att du kan placera en "APS.NET-Tag" på din sida eftersom denna då inte kommer att exekveras som en ASP.NET utan som ren HTML-Tag och då kommer HTML parsern inte att känna igen den.

Om du skulle vilja göra något liknande så är detta kanske en lösning (dålig men ändå något som du eftersträvar).

Du skapar en bas-sida, denna sida har endast en PlaceHolder på sida. När man nu kommer till denna sidas Page_Load() så har du en funktion som plockar ut all information från databasen, så som <ASP:Textbox id=apa runat=server/> osv osv...

All denna data från databasen sparar du nu ner som en NY fil med unikt id (GUID) och spara det som en UserControl. Sist i bas-sidans Page_Load() så laddar du dynamiskt in din nya UserControl med hjälp av LoadControl(FILNAMN). och lägger denna kontrol till placeholder som finns på din bas-sida. Det bör fungera så som du vill ha det, men är ingen bra lösning, skulle föreslå att du försöker dig på något som jag beskrev först, för oftast så vill du göra något med din Textbox som du skriver ut på sidan och med den senare lösningen så blir det lite jobbigare (går dock genom att lägga all kod i samma sida som dina HTML-tagar). Med min lösning så blir det lättare att implementar olika event som skall inträffa.

- Magnus

JmcMedlem sedan aug. 200249 inlägg
#10

Hej
Ja du har ju helt rätt..
Jag har funderat en hel del.
Målet är ju att kunna vara så flexibel som möjligt, vad tror du om att lagra html:en och lägga in egna taggar typ ##en template##
Och i databasen definiera templates, en template kan vara ren html eller ett object, object och dess eventuella properties finns i databasen.
När sidan laddas ersätter man alla ##en template## med den kod som som finns.
Om det är ett objekt skapar man objectet dynamisk och kör rendercontrol, sedan ersätter man med den htmlkod som den genererat.
Jag inser att det kan bli en hel del anrop till databasen.
Det kanske inte är en optimal lösning.
jag ska testa att implementera det så får vi se om det fungerar eller inte...
Kom gärna med förslag.

/Jimmy

GladhMedlem sedan maj 20012 812 inlägg
#11

Och i databasen definiera templates, en template kan vara ren html eller ett object, object och dess eventuella properties finns i databasen.
När sidan laddas ersätter man alla ##en template## med den kod som som finns.

Problemt är att du har en ##templat_textbox## på din sida och när sidan sedan körs i codebehind, så vill du byta ut denna template mot <ASP:Textbox>. Detta är en dålig ide:
- Först möter du på problemet att du skall få tag i HTML-koden (som innehåller din ##Template##) i din codebehind, inte helt trivialt (om det ens går innan Page_UnLoad(), inte säkert det går där ens).
- Ditt andra problem vilket du knappast kommer komma runt är att om du lyckas byta ut din ##Template## mot <ASP:Textbox> så kommer det i den HTMLkod som skickas till klienten att stå <ASP:Textbox> och inte <input type="textbox"> som det borde, och det beror på att ASP.NET Parsern aldrig har fått reda på att det funnits någon <ASP:Textbox> kod. Mycket möjligt att man kan komma runt det, men du är verkligen ute på djuptvatten här.

Skall jag vara helt ärlig så tycker jag inte att man skall kunna lagra någon som helst HTML i databasen, du skall bara lagra en massa id för olika kontroller, och när man hittar ett speciellt id så bör man i codebehinden skapa den kontrollen som id motsvarar.

Då får du ett extremt flexibelt system, som du enkelt kan bygga ut med nya kontroller. Nu vet jag inte riktigt vad det är som du vill bygga, men säg att du vill placera en text på sidan någonstans, då spara du ner ett <ASP:Literal> Id i databasen samt vad texten är samt annat lullu som vilket CSS som skall användas. Samt till vilken panel kontrollen tillhör och var i denna panel som den skall placeras.

Om du sedan vill ha in en textbox under texten så skapar du ett <ASP:Textbox> id i databas och olika lullu data till det. Om du bara tänker till när du skapar din databas så kan du få ett extremt flexibeltsystem som är enkelt att bygga ut med nya kontroller och annat som behövs under vägen.

- Magnus

269 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
137 ms — hämta forumlista (db)
128 ms — hämta statistik (db)
135 ms — hämta tråd, inlägg och bilagor (db)