2009-06-26 4 views
0

웹 사이트의 기본 레이아웃 템플릿을 지정하는 기본 마스터 페이지가 있습니다. 또한 섹션에 따라 탭을 변경하는 논리를 처리하고 페이지 메타 정보도 설정합니다. 동적 중첩 마스터 페이지, 공유 속성

나는 동적으로 쿼리 문자열을보고 데이터베이스에서 레코드를 로딩하고, 그 기록에서 발견되는 값에 따라 동적으로 중첩 된 마스터 페이지를 설정하여 중첩 된 마스터 페이지를로드하고 있습니다. 레이아웃과 기능적 차이를 위해 동적 중첩 마스터 페이지를로드해야합니다.

내가 추가 데이터베이스 호출을 피할 수 있도록 기본 마스터 페이지와 동적으로로드 마스터 페이지에서 사용하려면 해당 레코드에 추가 정보가 있습니다.

현재, 나는 MasterPage은 기본 마스터 페이지에 대한 기본 클래스 역할을 상속하는 클래스를 설정했습니다. 기본 마스터 페이지와 중첩 된 동적으로 호출되는 마스터 페이지간에 공유하려는 데이터베이스 호출을 나타내는 개체를 보유하는 공유 (정적) 속성이 있습니다.

그것은 작동하지만, 조금 못생긴 것 같다. 다른 더 나은 솔루션이 있습니까?

답변

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 페이지는이 기본 페이지를 상속하고 동적으로 마스터 페이지를 설정합니다. (

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

당신은 항상 HttpContext.Items 컬렉션의 기록을 통과 할 수있다. Items 컬렉션에 있으면 요청 기간 동안 HttpContext에 도달 할 수있는 모든 항목에서 사용할 수 있습니다.

+0

예,이 작업,하지만 내가 아는 한 당신은 강한 타이핑을 잃게 :

<%@ 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> 

... 그리고 동적으로 불리는 마스터 페이지에 내가 캐스팅하여 페이지의 기본 클래스를 참조 할 수 있습니다 추가 작업없이). – ScottE

+0

일반적으로 정적 속성 클래스 또는 인스턴스 클래스를 사용하여 HttpContext.Items 컬렉션을 통해 전달해야하는 상황을 래핑했습니다. 나는 아이템에 넣은 데이터에 대한 속성을 가진 ContextItems 클래스와 같은 것을 가질 것이다. 내가 입력 한 입력 된 클래스로 Items 컬렉션에서 데이터를 반환하려면 거기에 내 입력을 수행합니다. –

관련 문제