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

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

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

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

Любые идеи?


person Chris Haines    schedule 24.02.2009    source источник


Ответы (4)


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

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

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

person Andy Rose    schedule 24.02.2009
comment
Хм, да, это одно из решений. К сожалению, это означает размещение кода на каждой странице, использующей главную страницу, а не в одном месте. Я не уверен, что из двух зол меньше ... копирование мастер-страницы так, чтобы было две копии, было бы гораздо меньше работы! - person Chris Haines; 24.02.2009

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

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

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

person Zhaph - Ben Duguid    schedule 02.03.2009

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

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

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

person Dan F    schedule 14.05.2009
comment
Но это изменит только внутреннюю мастер-страницу, а не внешнюю, чего хотел Хейнси. Я бы сказал, что у вас проблема с внешним мастером, у которого нет всех заполнителей, необходимых для внутреннего мастера. - person Zhaph - Ben Duguid; 15.05.2009
comment
Аааааааааааааааааааааааu У меня не тот конец палки, извините. У меня была стандартная страница с одним мастером, а не вложенный мастер. Это научит меня сначала читать и думать :-) - person Dan F; 15.05.2009

Чтобы добавить к ответу 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";
            }
        }
    }
}
person James Lawruk    schedule 16.11.2010