9 Stimmen

Kann ich das Master einer verschachtelten Masterseite dynamisch ändern?

Okay, wir alle wissen, wie man dynamisch eine Master-Seite in einem Ereignis OnPreInit einer Seite ändert.

Aber was ist mit einer verschachtelten Master-Seite? Kann ich den Master einer Master-Seite ändern?

Es gibt kein OnPreInit-Ereignis in der MasterPage-Klasse.

Irgendwelche Ideen?

9voto

Andy Rose Punkte 16232

Nur getestet und es funktioniert ab dem PreInit der Seite, die die verschachtelte MasterPage verwendet.

protected void Page_PreInit(object sender, EventArgs e)
{
    this.Master.MasterPageFile = "/Site2.Master";
}

Natürlich müssen Sie sicherstellen, dass die ContentPlaceholderIds konsistent sind, wenn Sie zwischen den Seiten wechseln.

3voto

Zhaph - Ben Duguid Punkte 26343

Wir kombinieren Andys Methode mit einer "BasePage" -Klasse - wir erstellen eine Klasse, die von System.Web.UI.Page erbt, und dann erben alle unsere Seiten von dieser Klasse.

Dann können wir in unserer Basisklassen-Seite die relevanten Überprüfungen durchführen, um festzustellen, welche Stamm-Masterseite verwendet werden soll - in unserem Fall haben wir einen "Präsentations"-Master und einen "Erstellungs"-Master - die Präsentationsversion enthält die gesamte Navigation und Seitenmöbel sowie eine detaillierte Anzeige-CSS, während der Erstellungs-Master einige zusätzliche JS für die Erstellungswerkzeuge, leichtere CSS und keine Navigation enthält (es wird verwendet, wenn der Benutzer tatsächlich eine Seite erstellt, anstatt das Layout der Website zu ändern).

Diese Basisklasse kann dann Page.Master.MasterPageFile aufrufen und es auf den Erstellungs-Master setzen, wenn dies der richtige Zustand für die Seite ist.

2voto

Dan F Punkte 11764

Falls jemand zufällig über dies stolpert und sich die Haare ausreißt mit einem Fehler "Inhaltssteuerelemente müssen Top-Level-Steuerelemente in einer Inhaltsseite oder einer verschachtelten Masterseite sein, die eine Masterseite referenziert", wenn er Andys Code ausprobiert, entfernen Sie this.Master. Also lautet der Code:

protected void Page_PreInit(object sender, EventArgs e)
{
    MasterPageFile = "/Site2.Master";
}

Bearbeiten Wie Zhaph unten erwähnt, wird der Code den aktuellen Master der Seite ändern, nicht den Master-Master. Dies ist der Code, über den Hainesy sprach, als er "wir alle wissen, wie man dynamisch eine Masterseite ändert" erwähnte (was ich nicht wusste, oh je). Falls Sie zufällig über diese Seite gestolpert sind, indem Sie "stackoverflow change master page" googeln (genau wie ich), dann ist dies möglicherweise der Code, den Sie suchen :-)

0voto

James Lawruk Punkte 27947

Um die Antwort von Zhaph - Ben Duguid zu ergänzen (+1 übrigens):

Hier ist Beispielcode, der die Masterseite der verschachtelten Masterseite festlegt. Alle Seiten erben von dieser BasePage, daher existiert dieser Code nur an einer Stelle.

public class BasePage : System.Web.UI.Page
{
    private void Page_PreInit(object sender, System.EventArgs e)
    {
        if (Request.Browser.IsMobileDevice)
        {
            if (Page.MasterPageFile == "~/master/nested.master")) 
            {
                Page.Master.MasterPageFile = "~/master/mobile.master";
            } 
            else 
            {
                MasterPageFile = "~/master/mobile.master";
            }
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X