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

Итак, все мы знаем о динамическом изменении главной страницы в событии 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";
}

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

Чтобы добавить к ответу Zhaph - Ben Duguid, (+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";
            }
        }
    }
}