动态嵌套母版页,共享属性

时间:2022-10-19 23:19:46

I have a base master page that specifies the main layout template of a website. It also handles some logic that changes tabs depending on the section, and also sets page meta information.

我有一个基本母版页,指定网站的主要布局模板。它还处理一些逻辑,根据部分更改选项卡,还设置页面元信息。

I'm dynamically loading nested master pages by looking at the querystring, loading up a record from the database, and setting the nested master page dynamically based on a value found in that record. I need to load dynamic nested master pages for layout and functional differences.

我通过查看查询字符串,从数据库加载记录以及根据该记录中找到的值动态设置嵌套母版页来动态加载嵌套母版页。我需要为布局和功能差异加载动态嵌套母版页。

There is additional information in that record that I want to use in the base master page and in the dynamically loaded master page so I can avoid additional database calls.

我希望在基本母版页和动态加载的母版页中使用该记录中的其他信息,以便我可以避免其他数据库调用。

Currently, I have set up a class that inherits MasterPage to act as the base class for the base master page. I have a shared (static) property that holds the object representing the database call that I want to share between the base master page and the nested, dynamically called master page.

目前,我已经建立了一个继承MasterPage的类,作为基本母版页的基类。我有一个共享(静态)属性,它保存表示我想在基本母版页和嵌套的动态调用母版页之间共享的数据库调用的对象。

It works, but it seems a little ugly. Are there any other better solutions?

它有效,但似乎有点难看。还有其他更好的解决方案吗?

2 个解决方案

#1


You could always pass the record in the HttpContext.Items collection. Once it is in the Items collection it is available to every thing that can reach the HttpContext for the duration of the request.

您始终可以在HttpContext.Items集合中传递记录。一旦它在Items集合中,它就可用于在请求期间可以到达HttpContext的每个东西。

#2


Ok, I had to sleep on this one a bit, but I came up with a cleaner solution. I ended up using a base class for the page, instead of a base class for the master page. The base page sets the meta that I was going to set in the base master page.

好吧,我不得不在这一点睡觉,但我提出了一个更清洁的解决方案。我最终使用了页面的基类,而不是母版页的基类。基页设置我将在基本母版页中设置的元数据。

Public Class PageBase
    Inherits Page

    Private _DocDetails As FolderDocument
    Public Overridable ReadOnly Property DocDetails() As FolderDocument
        Get
            Return _DocDetails
        End Get
    End Property

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack() Then
            SetMeta()
        End If
    End Sub

    Protected Sub SetMeta()

        If DocDetails IsNot Nothing Then
            Page.Title = DocDetails.MetaTitle
            If DocDetails.MetaKeywords <> String.Empty Then
                Dim metaKeywords As New HtmlMeta()
                metaKeywords.Name = "Keywords"
                metaKeywords.Content = DocDetails.MetaKeywords
                Page.Header.Controls.Add(metaKeywords)
            End If
            If DocDetails.MetaDescription <> String.Empty Then
                Dim metaDescription As New HtmlMeta()
                metaDescription.Name = "Description"
                metaDescription.Content = DocDetails.MetaDescription
                Page.Header.Controls.Add(metaDescription)
            End If
        End If

    End Sub

End Class

..And then the aspx page inherits this base page and dynamically sets the master page.

..然后aspx页面继承此基页并动态设置母版页。

<%@ Page Language="VB" Inherits="PageBase" %>
<script runat="server">

    Private _DocDetails As FolderDocument
    Public Overrides ReadOnly Property DocDetails() As FolderDocument
        Get
            Return _DocDetails
        End Get
    End Property

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs)
        _DocDetails = FolderDocuments.GetFolderDocument()

        If _DocDetails IsNot Nothing Then
            If _DocDetails.MasterPage <> "" Then
                Me.MasterPageFile = String.Format("~/templates/{0}.master", _DocDetails.MasterPage)
            End If
        End If

    End Sub
</script>

...and in the dynamically called master page I can reference the page's base class by casting:

...在动态调用的母版页中,我可以通过强制转换来引用页面的基类:

Dim parentPage As PageBase = DirectCast(Page, PageBase)
Response.write(parentPage.DocDetails.Title)

#1


You could always pass the record in the HttpContext.Items collection. Once it is in the Items collection it is available to every thing that can reach the HttpContext for the duration of the request.

您始终可以在HttpContext.Items集合中传递记录。一旦它在Items集合中,它就可用于在请求期间可以到达HttpContext的每个东西。

#2


Ok, I had to sleep on this one a bit, but I came up with a cleaner solution. I ended up using a base class for the page, instead of a base class for the master page. The base page sets the meta that I was going to set in the base master page.

好吧,我不得不在这一点睡觉,但我提出了一个更清洁的解决方案。我最终使用了页面的基类,而不是母版页的基类。基页设置我将在基本母版页中设置的元数据。

Public Class PageBase
    Inherits Page

    Private _DocDetails As FolderDocument
    Public Overridable ReadOnly Property DocDetails() As FolderDocument
        Get
            Return _DocDetails
        End Get
    End Property

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack() Then
            SetMeta()
        End If
    End Sub

    Protected Sub SetMeta()

        If DocDetails IsNot Nothing Then
            Page.Title = DocDetails.MetaTitle
            If DocDetails.MetaKeywords <> String.Empty Then
                Dim metaKeywords As New HtmlMeta()
                metaKeywords.Name = "Keywords"
                metaKeywords.Content = DocDetails.MetaKeywords
                Page.Header.Controls.Add(metaKeywords)
            End If
            If DocDetails.MetaDescription <> String.Empty Then
                Dim metaDescription As New HtmlMeta()
                metaDescription.Name = "Description"
                metaDescription.Content = DocDetails.MetaDescription
                Page.Header.Controls.Add(metaDescription)
            End If
        End If

    End Sub

End Class

..And then the aspx page inherits this base page and dynamically sets the master page.

..然后aspx页面继承此基页并动态设置母版页。

<%@ Page Language="VB" Inherits="PageBase" %>
<script runat="server">

    Private _DocDetails As FolderDocument
    Public Overrides ReadOnly Property DocDetails() As FolderDocument
        Get
            Return _DocDetails
        End Get
    End Property

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs)
        _DocDetails = FolderDocuments.GetFolderDocument()

        If _DocDetails IsNot Nothing Then
            If _DocDetails.MasterPage <> "" Then
                Me.MasterPageFile = String.Format("~/templates/{0}.master", _DocDetails.MasterPage)
            End If
        End If

    End Sub
</script>

...and in the dynamically called master page I can reference the page's base class by casting:

...在动态调用的母版页中,我可以通过强制转换来引用页面的基类:

Dim parentPage As PageBase = DirectCast(Page, PageBase)
Response.write(parentPage.DocDetails.Title)