Настройка главной страницы ASP.NET во время выполнения - PullRequest
8 голосов
/ 19 августа 2008

Я работаю над сайтом, который должен поддерживать два или более внешнего вида, изменяемых во время выполнения. Я надеялся, что смогу справиться с этим изменением с помощью переключателя CSS, но, похоже, мне нужно будет использовать разные мастер-страницы для каждого дизайна.

Итак, как лучше всего установить мастер-страницу во время выполнения? Page.MasterPageFile может быть установлен только в событии Page.OnPreInit. Похоже, что решения должны сделать все мои страницы наследуемыми от общей базы, которая обрабатывает событие PreInit, или использовать HttpModule, который делает это.

Любой совет?

Ответы [ 6 ]

6 голосов
/ 19 августа 2008

Я уже делал это однажды, я сделал именно то, что вы описали (заставил все страницы наследоваться от пользовательской страницы с событием OnPreInit). Кроме того, у меня был собственный Application_PreRequestHandlerExecute в моем Global.asax.cs для настройки Page.StyleSheetTheme для выполнения изменений изображения / CSS, которые не требовали другой главной страницы.

2 голосов
/ 23 февраля 2009

Я чувствую твою боль. Я искал около часа (если не больше) проблемы, но безуспешно. Это не просто простой ответ, чтобы сказать «просто позвоните из PreInit на каждой странице», когда у вас есть сотни страниц. Но потом я понял, что трачу больше времени на поиск решения, чем просто на каждой странице.

Однако я хотел установить MasterPageFile на основе свойства профиля, чтобы на каждой странице было около 5 строк кода, что является кошмаром для удобства обслуживания. И вообще, "не повторяйся", верно?

Итак, я создал метод Extension в модуле в папке App_Code, чтобы сделать это проще и удобнее в обслуживании.

Public Module WebFunctions

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetMaster(ByVal page As Page)

        Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon)

        If pb IsNot Nothing Then
            page.MasterPageFile = pb.MasterPage
        End If

    End Sub

End Module

И затем на каждой странице PreInit, я просто называю это:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        Me.SetMaster()
    End Sub
2 голосов
/ 19 августа 2008

Вместо двух разных главных страниц, как насчет того, чтобы иметь один мастер, который динамически загружает разные пользовательские элементы управления и литералы содержимого HTML?

1 голос
/ 19 августа 2008

Достаточно просто обработать PreInit и вставить одну строку кода, необходимую для загрузки соответствующей мастер-страницы.

this.Page.MasterPageFile = "~/default.master";

В отсутствие какой-либо веской причины не идти по этому пути, это то, что я буду делать, независимо от того, где вы обрабатываете PreInit.

0 голосов
/ 29 августа 2013

Наследовать все свои страницы из базового класса, как

public class PageBase : System.Web.UI.Page
{
    public PageBase()
    {
        this.PreInit += new EventHandler(PageBase_PreInit);
    }
    void PageBase_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "~/MyMasterPage.Master";
    }
}
0 голосов
/ 19 августа 2008

Мне интересно, что решает, как должна выглядеть страница? Это пользователь нажимает кнопку, чтобы сменить тему? Он основан на URL-адресе, который использовался для перехода на сайт?

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

Я видел, как несколько сайтов устанавливали файлы cookie на основе кликов пользователей (для изменения размера шрифта или ширины страницы), а затем применяли различные файлы CSS в зависимости от значения этих файлов cookie. Если файл cookie отсутствует, отобразите внешний вид по умолчанию.

EDIT:

Еще одна мысль, если вы просто пытаетесь отключить CSS, это установить тег стиля для запуска на сервере и назначить ему свойства во время выполнения. Еще раз это потребует использования единой главной страницы и размещения кода в качестве кода главной страницы, возможно, в обработчике событий PreInit.

Поскольку я никогда не реализовывал это решение, я не уверен, должен ли весь тег выполняться на сервере или нет.


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>
...