2009-08-12 6 views
1

내 마스터 페이지에ASP.net에서 마스터 페이지 함수 재정의

<div class ="breadcrumbs" runat="server"><%= SitePath()%></div> 

SitePath()는 정적 사이트 맵과 동적으로 생성 된 페이지의 조합을 기반으로 탐색 요소를 만드는 사용자 정의 클래스를 만듭니다. 사용자 정의 이동 경로 탐색 요소에 대한 html을 반환합니다.

다음은 내 코드에서 SitePath() 코드입니다.

public string SitePath() 
{ 
    BreadCrumbNav breadNav = new BreadCrumbNav(); 
    breadNav.divClass = ".dv"; 
    breadNav.homeTitle = "ABC Home"; 
    return breadNav.Build(); 
} 

경로에 추가 할 수 있도록 동적 페이지에서 재정의 할 수 있기를 바랍니다. 예를 들어 ...

public override string SitePath() 
{ 
    BreadCrumbNav breadNav = new BreadCrumbNav(); 
    breadNav.divClass = ".dv"; 
    breadNav.homeTitle = "ABC Home"; 
    breadNav.AddPage("Cooking Equipment", "PathyGoodness/Cooking+Equipment.ASPX"); 
    breadNav.AddPage("Toasters", "PathyGoodness/Cooking+Equipment/Toasters.ASPX"); 
    return breadNav.Build(); 
} 

마스터 페이지 메서드를 범위로 가져 와서 재정의 할 수 있습니까? 아니면 다른 방식으로이 작업을 수행해야합니까? 나는 정말 명백한 것을 놓치고있는 것처럼 느껴진다. 그러나 나는 붙어있는 것처럼 보인다.

귀하의 도움에 감사드립니다!

답변

2

마스터 페이지가 실제로 상속되지 않고 템플릿으로 사용되므로 직접 적용 할 수 없습니다. 당신이 시도 할 수

몇 가지 다른 방법 :

우선,의 ContentPlaceHolder에 넣고 만 필요한 경우 개별 페이지의 ASPX 마크 업에 우선합니다.

더 복잡한 접근 방법은 모든 페이지에 대해 SitePath() 메서드가 있다는 것을 상속하는 인터페이스를 만드는 것입니다. 페이지에서 대신 마스터로부터 해당 메서드를 호출하고 동작을 "오버라이드"하지 않는 페이지에서는 단순히 마스터를 호출하십시오. 다른 경우에는 해당 구현에 특정 구현을 추가하고 실망하게하십시오! (당신은 또한 그 방법에서 마스터를 호출하기 위해 추상적 인 BasePage-type 클래스를 사용할 수 있다고 가정합니다)

+0

도움 주셔서 감사합니다. 이것은 정확하게 내가 알아야 할 필요가있는 것입니다. 나는 단순함을 위해서 마스터 페이지에 공개 메소드를 공개하여 컨텐츠 페이지에서 추가 경로 정보를 전달할 것이라고 생각하고 있습니다. 어떻게되는지 살펴 보겠습니다.어쨌든 다시 감사드립니다 !! –

+0

대답은 괜찮은 것처럼 보이지만 정확한 방법은 마스터스 타이트를 참조하고 아이디 페이지에서 속성이나 기능을 통해 필요한 모든 것에 직접적으로 영향을 미치는 것입니다. @Myke Black이 올바른 방법을 가지고있다. – ppumkin

1

일반적으로 메신저 클래스에 페이지/컨텍스트 특정 메소드를 두는 것에 반대합니다. 왜? Josh가 언급했듯이, Masterpages는 템플릿 일뿐입니다. 마스터 페이지에서 상속받지 않으며 페이지 객체에 액세스하지 않고도 마스터 페이지를 표시 할 수 없습니다. 따라서 Page 클래스에 이러한 메서드를 추가하는 것이 더 적합합니다.

+0

나는 동의하는 경향이있다. 마스터 페이지에서 nav 요소를 처리하도록합니다. 일반적으로 사이트 맵 기반 사이트 링크를 사이트에 추가하고 내 페이지의 대부분은 충분합니다. 나는 여분의 코드를 강요함으로써이 페이지들을 혼란스럽게하고 싶지 않았다. 내가 사용한 솔루션은 마스터 페이지에서 AddPath() 메서드를 노출하는 것이 었습니다. 이렇게하면 동적으로 생성 된 urlRewritten 페이지가 사이트의 다른 페이지에 대한 추가 코드를 요구하지 않고도 경로를 등록 할 수 있습니다. 나는 해결책에 100 % 행복하다고 말할 수는 없지만 상황을 고려했을 때 가장 좋았다. –

+1

AddPath를 모든 페이지가 상속하는 기본 클래스에 넣음으로써 추가 코드로 개별 페이지를 어수선하게 만들지 않습니다. 결과적으로 스타일과 취향의 문제는 모두 결국 같습니다. Im은 다시 한번 외관을위한 것 인 무언가에 논리를 넣고 있습니다. 1. BasePage 클래스에 AddPath() 및 BuildPath()를 추가하십시오. 2. 필요하면 개별 페이지에서 this.AddPath()를 호출하십시오. 3. MasterPage에서 Page.BuildPath()를 호출하십시오. –

1

훨씬 간단한 방법은 하위 페이지에서 직접 마스터 컨트롤을 참조하는 것입니다. 마스터 페이지에서

, 그래서 같은 리터럴 컨트롤로 sitepath() 함수를 대체 : 마스터 페이지 사용하기위한 코드에서 다음

<div class ="breadcrumbs" runat="server"><asp:Literal id="litSitePath" runat="server" /></div> 

이 :

BreadCrumbNav breadNav = new BreadCrumbNav(); 
breadNav.divClass = ".dv";  
breadNav.homeTitle = "ABC Home";  
litSitePath.Text = breadNav.Build(); 

과의 자식 페이지를 다음과 같이 Master.FindControl 메서드를 사용하여 재정의 할 수 있습니다.

BreadCrumbNav breadNav = new BreadCrumbNav();  
breadNav.divClass = ".dv";  
breadNav.homeTitle = "ABC Home";  
breadNav.AddPage("Cooking Equipment", "PathyGoodness/Cooking+Equipment.ASPX");  
breadNav.AddPage("Toasters", "PathyGoodness/Cooking+Equipment/Toasters.ASPX");  
Literal litSitePath = (Literal)Master.FindControl("litSitePath"); 
litSitePath.Text = breadNav.Build(); 

쉬운 peasy 및 이벤트 핸들러 나 인터페이스 또는 그와 비슷한 것을 사용하지 마십시오.