2009-09-18 2 views

답변

7

닐스 (JDunkerley에 의해 제안)

활용 반사 문제에 대한 하나의 방법입니다. 인터페이스를 구현하는 것도 고려해 볼 수 있습니다.

  1. 메서드가 포함 된 인터페이스를 만듭니다.
  2. 마스터 페이지에 인터페이스 구현
  3. 컨트롤에서 인터페이스 유형을 통해 this.Page.Master을 참조하십시오.
  4. 방법을 호출하십시오.

이것은 더 나은 OO 접근 방식으로 연결이 적어지고 런타임 리플렉션보다 확실히 잘 수행됩니다.

도움이 되었기를 바랍니다.

+0

이 방법을 사용했는데 정상적으로 작동했습니다! 감사합니다 –

+0

도움이되기를 기쁘게 생각합니다! 해피 코딩 :-) –

12

당신은 페이지의 Master 속성 타입 System.Web.UI.MasterPage이다로 먼저 this.Page.Master 캐스팅해야합니다.

예를 들어

((MyMaster)this.Page.Master).MyFunction(); 
당신은 사용자 컨트롤의 뒤에 코드에 속성을 추가하여 기본 마스터 페이지의 유형을 확인할 수 있습니다

:

및 결과를 사용자 컨트롤 마크 업 (예 : 이 소스 코드에 주석으로 인쇄하려면이 줄을 추가 : 당신은 사용자 정의 컨트롤 내에서 masterpage에 함수를 호출하는 경우가 매우 thighly 코드를 couppling하는

<!-- <%= MType %> //--> 
+0

형식 또는 네임 스페이스 _Master를 찾을 수 없다는 오류가 발생합니다. ?? –

+0

RunTime에서 마스터 페이지의 유형을 확인할 수 있습니다. 대답은 초 단위로 업데이트됩니다. – JDunkerley

+0

유형은 ASP.masterpage_master이지만 컴파일 타임에는 사용할 수 없습니다. –

4

.

컨트롤은 해당 마스터를 기반으로하는 페이지에서만 사용할 수 있습니다. 나는 이것이 보통 나쁜 설계라고 생각하며, 적어도 demeter의 법칙을 위반할 것입니다.

정확히 무엇을 컨트롤에서 수행하기를 원하십니까?

1

JDunkerley가 맞습니다. 그러나 MVP를 사용하여 그것을 분리하는 방법을 설명 할 수있게되어 Heiko Hatzfeld가 말하는 디자인 문제를 피할 수 있습니다.

기본적으로 컨트롤과 마스터 페이지 모두에 대해 MVP 패턴을 구현하십시오. 방법에 대한 지침은 here을 참조하십시오. 마스터 인터페이스 (IMasterView)에서 호출 할 메소드를 선언하십시오. 다음으로 두 구성 요소 사이의 관계를 제어하는 ​​클래스를 작성하십시오. 우리는 이것을 PageController 클래스라고 부를 것입니다. 이 클래스의 인스턴스를 global.asax에 다음 줄을 추가하여 각 요청에 대한 요청 상태로 만듭니다.CS : 그런 다음 이벤트 또는 다른 메커니즘을 구현할 수 있습니다

var controller = HttpContext.Current.Items["Controller"] as PageController; 

: 그런 다음 다음 코드 라인을 통해 발표자 (마스터 및 제어)의 각각에서이 인스턴스에 액세스 할 수 있습니다

/* global.asax.cs */ 
protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // ... 
    HttpContext.Current.Items["Controller"] = new PageController(); 
    // ... 
} 

컨트롤이이 공유 객체를 통해 분리 된 방식으로 마스터에서 메소드를 호출 할 수있게합니다. 예 :

/* PageController.cs */ 
public event EventHandler SomeEvent; 

protected virtual void OnSomeEvent(EventArgs e) 
{ 
    Debug.Assert(null != e); 

    var handler = this.SomeEvent; 
    if (null != handler) 
     handler(this, e); 
} 

public void FireSomeEvent() 
{ 
    this.OnSomeEvent(EventArgs.Empty); 
} 

/* ControlPresenter.cs */ 
public ControlPresenter(IControlView view) 
    : base() 
{ 
    view.EventFired += (sender, e) => 
    { 
     var controller = HttpContext.Current.Items["Controller"] as PageController; 
     controller.FireSomeEvent(); 
    }; 
} 

/* MasterPresenter.cs */ 
public MasterPresenter (IMasterView view) 
    : base() 
{ 
    var controller = HttpContext.Current.Items["Controller"] as PageController; 
    controller.SomeEvent += (sender, e) => view.MyFunction(); 
} 

"EventFired"이벤트가 컨트롤의 인터페이스 (IControlView)에 선언되고 컨트롤에 구현되어 있는지 확인하십시오. 그런 다음 마스터에 영향을 미치기 위해 수행해야하는 작업 (이 메서드 호출)은이 이벤트를 발생시키고 MVP + PageContoller가 나머지 작업을 처리합니다.

건배

1

내가 지금 여기에, 일에 위의 답변을 얻을 수 없었다 나를 위해 일한 것입니다 :

당신은 사용자 컨트롤에서 마스터 페이지 속성을 참조 할. 그런 다음에

<%@ Register Src="~/Source/MasterPages/Main.master" TagPrefix="MSTR" TagName="MasterPage" %> 

:

public string BodyClass 
{ 
    set 
    { 
     this.masterBody.Attributes.Add("class", value); 
    } 
} 

지금과 같이 사용자 제어 ASCX 파일에 마스터 페이지에 대한 참조를 추가 :

첫째, 마스터 페이지는 그래서 같은 공공 재산이있을 것이다 뒤에 코드 (내 경우에는 C#)이 코드가 :

Main masterPage = (Main)this.Page.Master; 
masterPage.BodyClass = "container"; 

참조없이 사용자 정의 컨트롤 위의 마스터 페이지로 이동하면 마스터 페이지 클래스를 찾을 수 없습니다.

관련 문제