| |
ASP.NET, WebServices u. RemotingContentplaceholder dynamisch verändern in der Masterpage | | | Autor: Jojo | Datum: 23.03.12 10:57 |
| Hallo,
ich habe folgendens Problem:
In einer Masterpage gibt es 4 Contentplaceholder. (CPH1-CPH4)
Die Inhalte der CPH können sich verschieben.
So soll der Benutzer z.B. auswählen können welcher Inhalt in welchen Contentplaceholder angezeigt werden soll.
Ich habe das wie folgt gelöst:
<!-- Masterpage -->
<form id="form1" runat="server">
<%=Master_HTML(0)%>
<asp:contentplaceholder id='Contentplaceholder1' runat="server" />
<%=Master_HTML(1)%>
<asp:contentplaceholder id='Contentplaceholder2' runat="server" />
<%=Master_HTML(2)%>
<asp:contentplaceholder id='Contentplaceholder3' runat="server" />
<%=Master_HTML(3)%>
<asp:contentplaceholder id='Contentplaceholder4' runat="server" />
<%=Master_HTML(4)%>
</form> Im PreInit der Masterpage werden die ID auf die "echten" IDs gesetzt:
Public Master_HTML() As String
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As _
System.EventArgs)
Master_HTML = Split(Session("Master"), "<asp:contentplaceholder id=")
For I = 0 To UBound(Master_HTML) - 1
If I = 1 Then
Contentplaceholder1.ID = Left(Master_HTML(I), InStr(Master_HTML( _
I), Chr(34)) - 1)
ElseIf I = 2 Then
Contentplaceholder2.ID = Left(Master_HTML(I), InStr(Master_HTML( _
I), Chr(34)) - 1)
ElseIf I = 3 Then
Contentplaceholder3.ID = Left(Master_HTML(I), InStr(Master_HTML( _
I), Chr(34)) - 1)
ElseIf I = 4 Then
Contentplaceholder4.ID = Left(Master_HTML(I), InStr(Master_HTML( _
I), Chr(34)) - 1)
End If
If I > 0 Then
Master_HTML(I) = Right(Master_HTML(I), Len(Master_HTML(I)) - _
InStr(Master_HTML(I), "</asp:contentplaceholder>") - 24)
End If
Next I
End Sub In der Session("Master") ist der jeweilige HTML Code mit den richtigen CPH enthalten.
Das Problem ist, dass mein "Page_PreInit" Event garnicht aufgerufen wird und es schon vorher zu dem Fehler komt, dass der gesuchte CPH nicht gefunden werden kann.
Wer kann mir sagen was ich anders machen muss ...
Joachim | |
Re: Contentplaceholder dynamisch verändern in der Masterpage | | | Autor: Micke | Datum: 23.03.12 15:55 |
| du kannst vom codebehind nicht direkt auf die placeholder zugreifen, da sie i.d.S. kein html element sind.
ich würde meinen cph's sind nicht dafür gedacht komplett dynamisch gefüllt zu werden.
dafür kannst du ja gewöhnliche tags nutzen.
move dein html einfach in den tag deiner wahl, statt die id's zu tauschen
Micke
Beitrag wurde zuletzt am 23.03.12 um 16:01:28 editiert. | |
Re: Contentplaceholder dynamisch verändern in der Masterpage | | | Autor: Micke | Datum: 23.03.12 19:20 |
| Hi Jojo,
noch hab ich nicht geschluckt worüber du stolperst.
du schreibst die inhalte der cph können sich verschieben.
nehmen wir an du hast
<div id="Div1" runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder2" _
runat="server" />
</div>
<div id="Div2" runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder3" _
runat="server" />
</div> wenn du jetzt schreibst
div1.InnerHtml = Div2.InnerHtml
Div2.InnerHtml = string.empty
hast du quasi den ContentPlaceHolder3 verschoben, und sein inhalt steht jetzt dort wo vorher ContentPlaceHolder2 stand.
Nicht ?
Micke | |
Re: Contentplaceholder dynamisch verändern in der Masterpage | | | Autor: Jojo | Datum: 24.03.12 10:45 |
| Hey Micke,
um es verweg zu nehmen - Die Idee ist Spitze!
Bei der Umsetztung hängt es aber im Detail. Dazu muss ich wohl etwas mehr ins Detail gehen:
Ich lasse die Layouts von einem Design-Programm erstellen (Artisteer). Das Teil ist Super und kann extrem viel. Was ich Programmiere ist ein Webshop-System wo die Benutzer sich selbst die Layouts in Artisteer erstellen können und diese hochladen. Wie gesagt - das Teil ist extrem flexibel und das ist genau das Problem was ich habe. Je nachdem ob Du z.B: die Navigation über oder unter dem Kopf haben möchtest muss natürlich der Content an einer anderen Stelle stehen.
Das Problem kann ich mit Deinem Beispiel super lösen. Ich hänge einfach unten an die Seite 4 Divs dran und lade da die ContentplaceHolder rein. Die Inhalte verschiebe ich dann an die richtige Stelle
<form id="form1" runat="server">
<div id="DivMenuContentPlaceHolder" runat="Server"><asp:ContentPlaceHolder _
ID="MenuContentPlaceHolder" runat="server" /></div>
<div id="DivHeaderContentPlaceHolder" _
runat="Server"><asp:ContentPlaceHolder ID="HeaderContentPlaceHolder" _
runat="server" /></div>
<div id="DivSidebar1ContentPlaceHolder" _
runat="Server"><asp:ContentPlaceHolder ID="Sidebar1ContentPlaceHolder" _
runat="server"/></div>
<div id="DivSheetContentPlaceHolder" runat="Server"><asp:ContentPlaceHolder _
ID="SheetContentPlaceHolder" runat="server"/></div>
</form1> Das Artisteer erstellt eine fertige MasterPage. Diese lese ich ein und speicher mir den Inhalt in der Datenbank. Das blöde ist, dass der Aufbau der DIVs sich auch verändert. Deshalb kann ich die DIV nicht in der Masterpage anlegen sonder muss die auch über Innterhtml laden - in die Form1
form1.innerhtlm = MasterHTMLcode Die DIVs für die CPH können sich - je nach erstellem Layout - verändern.
Z.B:
<div class="art-nav-inner">
<asp:contentplaceholder id="MenuContentPlaceHolder" _
runat="server"></asp:contentplaceholder>
</div> oder
<div class="art-nav-outer">
<asp:contentplaceholder id="MenuContentPlaceHolder" _
runat="server"></asp:contentplaceholder>
</div> Ich muss jetzt ermitteln in welches DIV welcher MenuContentPlaceHolder muss. Das klappt auch noch.
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Master_HTML() As String = Split(Session("Master"), _
"<asp:contentplaceholder id=" & Chr(34))
Dim CPH(0 To 4) As String, DIV(0 To 4) As String, CPH_InnerHtml(0 To 4) _
As String
For I = 1 To UBound(Master_HTML) - 1
'Name des Contenplaceholders ermitteln
CPH(I) = Left(Master_HTML(I), InStr(Master_HTML(I), Chr(34)) - 1)
'Name des DIV Elements ermitteln
DIV(I) = Master_HTML(I - 1).Replace(Chr(34) & ">", "")
DIV(I) = Trim(Right(DIV(I), Len(DIV(I)) - InStrRev(DIV(I), Chr( _
34))))
'ContentPlaceholder Source entfernen
Master_HTML(I) = Right(Master_HTML(I), Len(Master_HTML(I)) - InStr( _
Master_HTML(I), "</asp:contentplaceholder>") - 24)
Next I
End Sub Ich habe jetzt in CPH() die Namen der Contentplacerholder und in DIV() die passenden Namen der DIVs
Jetzt muss ich noch die Inhalte der Contentplaceholer über die DIV in die CPH_InnerHTML() laden
Das klappt nicht! Hier bin ich mir nicht sicher wie das geht. Ich hatte es versucht mit so was wie:
CPH_InnerHtml(1) = CType(form1.FindControl(CPH(1)), HtmlGenericControl).InnerHtml
Aber hier ist wohl der Typ HtmlGenericControl falsch! Es kommt der Fehler:
Innerer Inhalt von DivHeaderContentPlaceHolder konnte nicht abgefragt werden, da der Inhalt nicht literal ist.
Die letzte Frage ist also:
Wie bekomme ich aus meinem DIV mit FindControl die Innerhtlm raus?
Joachim | |
Re: Contentplaceholder dynamisch verändern in der Masterpage | | | Autor: Micke | Datum: 27.03.12 11:39 |
| Hallo Joachim,
"Wie bekomme ich aus meinem DIV mit FindControl die Innerhtlm raus"
weiß ich auch nicht gerade ausm Kopf
Es scheint als ob deine contentplaceholder letztendlich eher userControls sind, schonmal überlegt diese als baustein zu benutzen (lassen) ? Dürfte der Handhabung der Dynamik zuträglich sein.
Micke | |
Re: Contentplaceholder dynamisch verändern in der Masterpage | | | Autor: Jojo | Datum: 27.03.12 12:02 |
| Hallo Micke,
ich habe es in der Zwischenzeit rausgefunden wie es geht ...
Dim sb = New StringBuilder()
form1.FindControl("Div" & CPH(1)).RenderControl(New HtmlTextWriter(New _
StringWriter(sb)))
CPH_InnerHtml(1) = sb.ToString() Das funktioniert primar - bei 3 der 4 Contentplaceholer.
Sobald der Inhalt etwas "Anspruchsvoller" wird - z.B. wenn AJAX in spiel kommt - dann klappt es nicht.
Da kommt dann immer das Problem, dass es in einem "runat=Server" Tag positioniert werden muss ...
ich habe das Thema erst mal zurückgestellt. Ist sehr Komplex.
Besten dank schon mal für Deine Mithilfe!
Joachim
Joachim | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|