Могу ли я динамически изменить мастер вложенной главной страницы? - PullRequest
9 голосов
/ 24 февраля 2009

Хорошо, мы все знаем об динамическом изменении главной страницы в событии OnPreInit страницы.

Но как насчет вложенной главной страницы? Могу ли я сменить магистратуру?

В классе MasterPage не выставлено событие OnPreInit.

Есть идеи?

Ответы [ 4 ]

9 голосов
/ 24 февраля 2009

Только что протестировал это, и оно работает из PreInit Страницы, которая использует вложенную MasterPage.

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

Очевидно, вам необходимо убедиться, что ContentPlaceholderIds одинаковы для всех страниц, между которыми вы меняетесь.

3 голосов
/ 02 марта 2009

Мы объединяем метод Энди с классом «BasePage» - мы создаем класс, который наследуется от System.Web.UI.Page, а затем все наши страницы наследуются от этого класса.

Затем в нашем классе базовой страницы мы можем выполнить соответствующие проверки, чтобы увидеть, какая корневая главная страница должна использоваться - в нашем случае у нас есть мастер «Presentation» и мастер «Authoring» - версия презентации имеет все навигация и оформление страницы, наряду с интенсивным отображением CSS, в то время как мастер разработки имеет несколько дополнительных JS для инструментов разработки, более легкий CSS и отсутствие навигации (это то, что мы используем, когда пользователь фактически создает страницу, а не изменяет сайт макет).

Эта базовая страница может затем вызвать Page.Master.MasterPageFile и установить ее в качестве ведущего устройства, если это правильное состояние для страницы.

2 голосов
/ 14 мая 2009

На всякий случай, если кто-то наткнется на это и вырвет себе голову с ошибкой « Контент должен быть элементом управления верхнего уровня на странице контента или вложенной главной страницей, ссылающейся на главную страницу », когда пробуя код Энди, избавьтесь от this.Master. Итак, код становится:

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

Редактировать Как указывает Zhaph ниже, у меня есть код ^^, который изменит только мастера текущей страницы, а не мастера мастера. Это тот код, о котором говорил Хейнеси, когда он упомянул: « мы все знаем о динамическом изменении главной страницы » (чего я не сделал, черт возьми). Если вы попадаете на эту страницу, прибегая к помощи " главной страницы изменения изменений stackoverflow " (что я и сделал), то, возможно, это код, который вы ищете: -)

0 голосов
/ 16 ноября 2010

Чтобы добавить к ответу Жаф - Бен Дугид, (+1 к слову):

Вот пример кода, который устанавливает главную страницу вложенной главной страницы. Все страницы наследуются от этой BasePage, поэтому этот код существует только в одном месте.

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";
            }
        }
    }
}
...