我正在一個需要能夠支持兩個或更多外觀的網站上工作,在運行時可以改變。我希望能夠通過CSS開關處理更改,但看起來我需要爲每個設計使用不同的主頁。在運行時設置一個ASP.NET主頁
那麼,在運行時設置主頁的最佳方式是什麼? Page.MasterPageFile只能在Page.OnPreInit事件中設置。看起來解決方案是讓我的所有頁面都從一個處理PreInit事件的公共基礎繼承,或者使用一個HttpModule來完成。
有什麼建議嗎?
我正在一個需要能夠支持兩個或更多外觀的網站上工作,在運行時可以改變。我希望能夠通過CSS開關處理更改,但看起來我需要爲每個設計使用不同的主頁。在運行時設置一個ASP.NET主頁
那麼,在運行時設置主頁的最佳方式是什麼? Page.MasterPageFile只能在Page.OnPreInit事件中設置。看起來解決方案是讓我的所有頁面都從一個處理PreInit事件的公共基礎繼承,或者使用一個HttpModule來完成。
有什麼建議嗎?
我已經做過一次之前,我做了你所描述的(使所有的頁面從一個OnPreInit事件的自定義頁面繼承)。此外,我在我的Global.asax.cs中有一個自定義的Application_PreRequestHandlerExecute,用於設置Page.StyleSheetTheme用於執行不需要其他主頁面的image/css更改。
而不是兩個不同的母版頁如何有一個主動態加載不同的用戶控件和內容HTML文字?
處理PreInit並插入加載正確主頁所需的一行代碼非常簡單。
this.Page.MasterPageFile = "~/default.master";
在沒有一些令人信服的理由不走這條路,那就是我想要做的,無論在哪裏你處理PreInit的。
我很好奇什麼決定頁面的外觀?用戶點擊按鈕來改變主題嗎?它是基於用於訪問該網站的網址嗎?
母版頁支持後面的代碼,所以你可以在你的一個母版頁中放一些邏輯來決定應該顯示什麼。
我已經看到幾個網站根據用戶點擊設置cookie(更改字體大小或頁面寬度),然後根據這些cookie的值應用不同的CSS文件。如果不存在cookie,則顯示默認外觀。
編輯:
另一個想到這裏,如果你只是想轉出CSS是設置你的風格標籤在服務器上運行,並在運行時的屬性分配給它。再次,這需要使用一個主頁面,並將代碼放在主頁面的代碼隱藏中,可能在PreInit事件處理程序中。
因爲我從來沒有實現過這個解決方案,所以我不確定是否整個<標頭都必須在服務器上運行。
<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>
我感到你的痛苦。我搜索了大約一個小時(如果不是更多),對於這個問題,沒有成功。當您擁有數百頁時,說「只需從每個頁面上的PreInit調用它」不僅僅是一個簡單而乾燥的答案。但後來我意識到,我花了更多時間尋找解決方案,而不是在每個頁面上都做這件事。
但是,我想根據配置文件屬性設置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
繼承所有你從一個基類頁面,如
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";
}
}