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가 나머지 작업을 처리합니다.
건배
이 방법을 사용했는데 정상적으로 작동했습니다! 감사합니다 –
도움이되기를 기쁘게 생각합니다! 해피 코딩 :-) –