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

时间:2009-06-26 02:20:24

标签: asp.net master-pages

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

..然后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>

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

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