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