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

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

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

Любой совет?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
8 594
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Ответ принят как подходящий

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

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

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

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

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

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

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

Обновлено:

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

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

tag has to run at the server or not.

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

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

Однако я хотел установить MasterPageFile на основе свойства Profile, чтобы на каждую страницу приходилось около 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

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

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

Другие вопросы по теме