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

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

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

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

Есть идеи?

4 ответа

Решение

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

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

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

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

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

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

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

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

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

Чтобы добавить к ответу Жаф - Бен Дугид, (+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";
            }
        }
    }
}
Другие вопросы по тегам