2008-08-18 4 views
8

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

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

Любые советы?

ответ

6

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

2

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

1

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

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

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

0

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

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

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

EDIT:

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

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


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

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

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

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