Benutzer mit den meisten Antworten
MasterPage: ContentPlaceHolder bzw. PlaceHolder

Frage
-
Hallo allerseits,
ich hätte da mal paar Fragen.
Ich habe eine MasterPage (Main.Master) mit 6 ContentPlaceHolder. Weiters habe ich eine Index.aspx der wiederum zum MasterPage verweist.
Da ich über die Index.aspx, die ContentPlaceHolder vom Main.Master nicht ansprechen konnteContentPlaceHolder cph = Master.FindControl("cphL1") as ContentPlaceHolder; if (Session["plL1"] != null) cph.Controls.Add(LoadControl(Session["plL1"].ToString()));
aufgrund folgender Fehlermeldung
ContentPlaceHolder kann nur in Dateien mit der Erweiterung ".master" verwendet werden.
..., habe ich die die UserControls in Main.Master zuweisen.
Aber auch hier bekomme ich die gleiche Fehlermeldung. Wie kann ich auf die ContentPlaceHolder von Main.Master
zugreifen bzw. ansprechen.Danke und Lg
String.Rise
Antworten
-
Hi,
... anderer Vorschlag.
Kann mir jemand ein kleines Projekt bereit stellen in dem veranschaulicht wird wie man
ein WebUserControl in ein ContentPlaceHolder reinlädt welches in der MasterPage definiert ist.Wäre für weitere Hilfe sehr dankbar.
man lädt kein WebUserControl in einen ContentPlaceHolder. Die dienen dazu, in einer ContentPage die entsprechenden Inhalte festzulegen.
Wenn Du in der MasterPage ein Control an eine bestimmte Position laden willst, macht man das in der Regel über die Deklaration.
<uc:DeinControl ... />
Wenn Du es unbedingt dynamisch machen willst:
<asp:PlaceHolder ID="ControlPlaceHolder" ... /> Dim MyControl As <DeineKlasse> = Page.LoadControl( "~/Controls/DeinControl.ascx" ) ControlPlaceHolder.Controls.Add( MyControl )
Wenn Du ContentPlaceHolder definierst, gibt es in der ContentPage dann entsprechende Content-Controls, die über die ContentPlaceHolderId den ContentPlaceHolder-Controls zugeordnet werden. Und _dort_ kannst Du dann von der ContentPage aus auch Controls hinzufügen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 5. August 2011 20:58
- Als Antwort markiert Stefan FalzModerator Mittwoch, 10. August 2011 11:14
-
Natürlich kannst Du mit einem PlaceHolder auch ein WebUserControl laden. Kein Ding. Aber eben - wie Stefan auch schon anmerkte - nur mit einem PlaceHolder, nicht mit einem ContentPlaceHolder.
Das ContentPlaceHolder-Control nutzt Du in Deiner MasterPage, um den oder die Bereiche zu definieren, in die zur Laufzeit die jeweiligen Seiteninhalte reingeladen werden. Das geschieht vor dem Load-Ereignis, vor irgendwelchen Ereignisbehandlungen, die Du vornimmst, vor irgendwas anderem. Was Du am Ende des Tages dann hast, ist eine Seite, die soweit fertig ist und die nur noch die Events abarbeitet. Wenn Du also dynamisch Dinge irgendwo reinladen willst, dann machst Du das - wie von Stefan schon angemerkt - nur mit einem PlaceHolder, denn den kannst Du zur Laufzeit (also dann, wenn Deine Ereignisbehandlung stattfindet) überhaupt noch ansprechen. Die ContentPlaceHolder sind dann für Dich nicht mehr ansprechbar.
Sorry, Junge.
Karsten Samaschke
WP7-Entwickler, WP7-Trainer, WP7-Coach
wpzone.de - Community rund um die WP7-Entwicklung
karsan.de - mein Weblog
familyblogger.de - mein Haus, mein Auto, meine Kinder- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 5. August 2011 20:58
- Als Antwort markiert Stefan FalzModerator Mittwoch, 10. August 2011 11:13
Alle Antworten
-
Hi,
in den meisten Fällen macht es keinen Sinn, die Elemente direkt anzusprechen. Es bietet sich eher an, bspw. eine Eigenschaft oder Methode in der Klasse der MasterPage anzulegen (public) und diese dann aufzurufen.
Wenn Du es trotzdem machen willst: Die Controls (auch die ContentPlaceHolder) werden standardmäßig private oder protected erzeugt. Stell das in der Xyz.master.designer.cs auf public um, dann sollte es gehen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
in den meisten Fällen macht es keinen Sinn, die Elemente direkt anzusprechen. Es bietet sich eher an, bspw. eine Eigenschaft oder Methode in der Klasse der MasterPage anzulegen (public) und diese dann aufzurufen.
Auch wenn ich eine eigene Methode als public aufrufe, werde ich die gleiche Exception bekommen sobald ich
die Placheolder anspreche bzw. ein UserControl lade.Ich werde dann mal den zweiten Vorschlage ausprobieren.
Danke und Lg
String.Rise -
Hi,
Auch wenn ich eine eigene Methode als public aufrufe, werde ich die gleiche Exception bekommen sobald ich
die Placheolder anspreche bzw. ein UserControl lade.nö. Die Methode ist ja in der MasterPage. Und die wiederum kennt ihre ContentPlaceHolder und die anderen Controls.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
... dann bekomme ich ein NullReferenceException. Die ContentPlaceHolder sind nicht instanziert.
Auch wenn ich im Designer die ContentPlaceHolder als Public definiere bekomme ich auch in dieser Methode
die obige Fehlermeldung.Ich versuch das nochmals zu veranschaulichen.
Ich habe eine ASPX-Seite (SeiteA) die eine eigene Mastgerpage (MasterA) hat.
Dann habe ich eine zweite Seite (SeiteB) die auch wiederum eine eigene Masterpage hat (MasterA).
Als Startseite ist SeiteA definiert. Alle Links sind auf jeder Masterpage vorhanden.
Jetzt wenn ich von SeiteA auf die SeiteB wechseln möchte wird die OnClick-Methode von der MasterA
aufgerufen und dort rufe ich mittels Response.Redirect die SeiteB auf. Doch bevor ich die Seite aufrufe
befülle ich die Session-Variablen damit die entsprechenden UserControls geladen werden können.Jetzt auf der SeiteB in der Page_Load Methode möchte ich die angegebenen UserControls in den
Session-Variablen in die ContentPlaceHolder laden.Wenn ich von hier aus eine Public-Methode von der MasterB aufrufe, sind alle Session-Variablen in der
aufgerufenen Methode leer. Auch wenn ich die Session-Werte als Paramater mitgebe.Das kanns ja wohl nicht sein!!!
Lg
String.Rise -
Hi,
Ich habe eine ASPX-Seite (SeiteA) die eine eigene Mastgerpage (MasterA) hat.
Dann habe ich eine zweite Seite (SeiteB) die auch wiederum eine eigene Masterpage hat (MasterA).
Als Startseite ist SeiteA definiert. Alle Links sind auf jeder Masterpage vorhanden.
Jetzt wenn ich von SeiteA auf die SeiteB wechseln möchte wird die OnClick-Methode von der MasterA
aufgerufen und dort rufe ich mittels Response.Redirect die SeiteB auf. Doch bevor ich die Seite aufrufe
befülle ich die Session-Variablen damit die entsprechenden UserControls geladen werden können.boah. Was ist das denn für ein übles Konstrukt? Irgendwie scheint es mir, als ob Du da irgendwo einen ziemlichen Designfehler in deiner Anwendung hast.
Ohne den Code und die Deklaration der Master- und der Inhaltsseiten zu kennen, kann man da allerdings nicht wirklich helfen. Poste die Sachen doch bitte mal. Wenn es zu groß ist, erstell ein kleines Beispielprojekt, mit dem man das nachvollziehen kann und stell das bitte als Download zur Verfügung. Dann kann man sich das mal anschauen und ggfs. Verbesserungsvorschläge machen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Nachtrag zu Stefan: Ich vermute, Du willst über die Navigation komplette Seiten neu laden lassen, ohne sie sichtbar neu laden zu lassen. Ganz schlechte Idee: Usability (die History funktioniert u.U. nicht okay, d.h., der Benutzer klickt auf die Zurück-Taste und landet ganz am Anfang) und auch Suchmaschinenfreundlichkeit (die mögen sowas mal grundsätzlich nicht) sind bei Deiner Idee gleich Null.
Lass es lieber sein, arbeite mit ein paar "richtigen" Links und mit einem "normalen" Seitentemplate.
Karsten Samaschke
WP7-Entwickler, WP7-Trainer, WP7-Coach
wpzone.de - Community rund um die WP7-Entwicklung
karsan.de - mein Weblog
familyblogger.de - mein Haus, mein Auto, meine Kinder -
... anderer Vorschlag.
Kann mir jemand ein kleines Projekt bereit stellen in dem veranschaulicht wird wie man
ein WebUserControl in ein ContentPlaceHolder reinlädt welches in der MasterPage definiert ist.Wäre für weitere Hilfe sehr dankbar.
@ksamaschk
[Quote]
Ich vermute, Du willst über die Navigation komplette Seiten neu laden lassen, ohne sie sichtbar neu laden zu lassen
[/Quote]
Verstehe ich nicht ganz???[Quote]
Lass es lieber sein, arbeite mit ein paar "richtigen" Links und mit einem "normalen" Seitentemplate.
[/Quote]
Was sind deiner Meinung nach richtige Links und SeitemTemplates.
Die MasterSeite ist eine StandardTemplate welches shon beim erstellen eines neuen Projekt angelegt.
Bitte genaue definieren was gemeint ist.Danke und Lg
-
Hi,
... anderer Vorschlag.
Kann mir jemand ein kleines Projekt bereit stellen in dem veranschaulicht wird wie man
ein WebUserControl in ein ContentPlaceHolder reinlädt welches in der MasterPage definiert ist.Wäre für weitere Hilfe sehr dankbar.
man lädt kein WebUserControl in einen ContentPlaceHolder. Die dienen dazu, in einer ContentPage die entsprechenden Inhalte festzulegen.
Wenn Du in der MasterPage ein Control an eine bestimmte Position laden willst, macht man das in der Regel über die Deklaration.
<uc:DeinControl ... />
Wenn Du es unbedingt dynamisch machen willst:
<asp:PlaceHolder ID="ControlPlaceHolder" ... /> Dim MyControl As <DeineKlasse> = Page.LoadControl( "~/Controls/DeinControl.ascx" ) ControlPlaceHolder.Controls.Add( MyControl )
Wenn Du ContentPlaceHolder definierst, gibt es in der ContentPage dann entsprechende Content-Controls, die über die ContentPlaceHolderId den ContentPlaceHolder-Controls zugeordnet werden. Und _dort_ kannst Du dann von der ContentPage aus auch Controls hinzufügen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 5. August 2011 20:58
- Als Antwort markiert Stefan FalzModerator Mittwoch, 10. August 2011 11:14
-
man lädt kein WebUserControl in einen ContentPlaceHolder. Die dienen dazu, in einer ContentPage die entsprechenden Inhalte festzulegen.
Mit PlaceHolder kann man WebUserControls laden.
Sorry jungs, aber ich werde das doch ohne Masterpage machen.
Ich hatte des öfteren ASPX-Seiten mit Placeolder erstellt und auch WebUserControls in die PlaceHolder geladen
und noch nie Probleme gehabt. Allerdings scheint mir das mit einer Masterpage nicht gut zu gelingen.
Ich wollte halt einmal mit einer MasterPage arbeiten, aber naja....Ich werde halt das äußerlicher von den Masterpages in den entsprechenden ASPX-Seiten reinpacken und
wie gewohnt mit PlaceHolder arbeiten.Danke nochmals für eure Unterstützung und sorry für die ... Fragen.
Wollte einfach den Sinn dahinter verstehen aber scheint nicht zu funktionieren.Lg
String.Rise -
Hi,
mir scheint, Du hast dich da in irgendwas verrannt, was so nicht funktionieren kann.
Du kannst problemlos eine MasterPage verwenden. Du kannst auch problemlos Controls dynamisch in (fast) beliebige Container hinzufügen. Nur eben nicht von der ContentPage über die MasterPage in den ContentPlaceholder, sondern von der ContentPage direkt in das ContentControl, welches mit dem entsprechenden ContentPlaceHolder verbunden ist.
Aber ejal, mach es halt so, wie Du es für richtig hältst.
Und BTW: Es gibt einen ziemlich großen Unterschied zwischen PlaceHolder und ContentPlaceHolder.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
-
Natürlich kannst Du mit einem PlaceHolder auch ein WebUserControl laden. Kein Ding. Aber eben - wie Stefan auch schon anmerkte - nur mit einem PlaceHolder, nicht mit einem ContentPlaceHolder.
Das ContentPlaceHolder-Control nutzt Du in Deiner MasterPage, um den oder die Bereiche zu definieren, in die zur Laufzeit die jeweiligen Seiteninhalte reingeladen werden. Das geschieht vor dem Load-Ereignis, vor irgendwelchen Ereignisbehandlungen, die Du vornimmst, vor irgendwas anderem. Was Du am Ende des Tages dann hast, ist eine Seite, die soweit fertig ist und die nur noch die Events abarbeitet. Wenn Du also dynamisch Dinge irgendwo reinladen willst, dann machst Du das - wie von Stefan schon angemerkt - nur mit einem PlaceHolder, denn den kannst Du zur Laufzeit (also dann, wenn Deine Ereignisbehandlung stattfindet) überhaupt noch ansprechen. Die ContentPlaceHolder sind dann für Dich nicht mehr ansprechbar.
Sorry, Junge.
Karsten Samaschke
WP7-Entwickler, WP7-Trainer, WP7-Coach
wpzone.de - Community rund um die WP7-Entwicklung
karsan.de - mein Weblog
familyblogger.de - mein Haus, mein Auto, meine Kinder- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 5. August 2011 20:58
- Als Antwort markiert Stefan FalzModerator Mittwoch, 10. August 2011 11:13