Сведения о вопросе

Ayrat

12:41, 26th August, 2020

Теги

.net   asp.net   master-pages    

Установка главной страницы ASP.NET во время выполнения

Просмотров: 426   Ответов: 6

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

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

Какой-нибудь совет?



  Сведения об ответе

DAAA

21:06, 1st October, 2020

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


  Сведения об ответе

fo_I_K

16:22, 20th August, 2020

Я чувствую твою боль. Я искал около часа (если не больше) для этого вопроса, но безуспешно. Это не просто резкий и сухой ответ, чтобы сказать "just call it from PreInit on each page", когда у вас есть сотни страниц. Но потом я понял, что трачу больше времени на поиски решения, чем потребовалось бы, чтобы просто сделать это на каждой странице.

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

Поэтому я создал метод расширения в модуле в папке 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


  Сведения об ответе

lesha

22:06, 16th August, 2020

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


  Сведения об ответе

SEEYOU

08:34, 23rd August, 2020

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

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

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


  Сведения об ответе

+-*/

19:21, 18th August, 2020

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

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

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

EDIT:

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

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


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


  Сведения об ответе

PAGE

17:26, 1st August, 2020

Унаследуйте все ваши страницы от базового класса, например

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";
    }
}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться