Итак, все мы знаем о динамическом изменении главной страницы в событии OnPreInit страницы.
Но как насчет вложенной главной страницы? Могу ли я сменить хозяина?
В классе MasterPage нет события OnPreInit.
Любые идеи?
Итак, все мы знаем о динамическом изменении главной страницы в событии OnPreInit страницы.
Но как насчет вложенной главной страницы? Могу ли я сменить хозяина?
В классе MasterPage нет события OnPreInit.
Любые идеи?
Просто протестировал это, и он работает с 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";
}
}
}
}