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

StackOverflow https://stackoverflow.com/questions/15228

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Я чувствую твою боль.Я искал около часа (если не больше) проблему с этим, но безуспешно.Это не просто лаконичный ответ: "просто вызывайте это из 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

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

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        Me.SetMaster()
    End Sub

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

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

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

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

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

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

Редактировать:

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

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


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

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

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";
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top