이것은 궁금한 질문입니다. ASP.NET 웹 양식에서 동적 컨트롤을 원할 경우 덜 나쁜 것 중 하나를 선택해야합니다. 궁극적으로, 그것은 타협점을 만들고 싶습니다. 즉, 발표자가보기에 관심을 갖거나 발표자의 관심사를 볼 수 있습니다.
내가 웹 양식에서 작업 할 때 나는 보통 후자를 선호 - 내가 발표자는 ASP.NET 페이지의 라이프 사이클에 연결되는 것을 동의하고 동적 컨트롤 생성하는 것이 필요 무엇이든 할 수있는 InitializeView
방법 작성 :
// Presenter
// This could also be parameterless if you prefer that idiom but
// then the view needs a SelectedState property that serves up values
// straight from the Form collection, and it won't be obvious why.
public void InitializeView(string selectedState) {
if (selectedState != null) {
view.Counties = dataLayer.GetCounties(selectedState);
}
}
// View
protected void Page_Init(object sender, EventArgs args) {
presenter.InitializeView(Request.Form["StateList"]);
// ... build counties drop-down ...
}
을
물론, 이는 발표자의 의미를 ASP.NET 수명주기와 연결하고 해당 메서드에서 진행중인 작업을가립니다. 에 ProcessSelectedState
과 같은 더 구체적인 이름을 지정하여 완화 할 수 있지만 메소드 이름이 페이지 수명주기를 참조하지 않는 한 나머지 모델을 가져 오는 것이 아니라는 것을 분명히 알 수는 없습니다 (presenter.LoadModel
또는 기타 당신은 그것을 부를지도 모른다).
나는 대안이 매력적입니다 방법을 볼 수 있습니다 다음 Presenter
의
protected void Page_Init(object sender, EventArgs args) {
if (Request.Form["StateList"] != null) {
List<string> counties = presenter.GetCounties(Request.Form["StateList"]);
// ... build counties drop-down ...
}
}
의미 체계가 완벽하게 명확하다 - GetCounties
가 무엇을 이해하기 쉽게 그리고 그것은 페이지 수명주기와는 아무 상관이 없습니다. 그러나 당신은 당신의 견해에있어 테스트할만한 것들을 가지고 있습니다. 그것은 어설픈데, 그것은 내 발표자들이 그들의 뷰 엔진을 모르는 채로 유지하는 것보다 나에게 더 중요합니다.
다른 대안은 페이지 초기화 중 모델 전체를 로드하는 것입니다. 서버 제어 값을 사용할 수 없으므로 Request.Form
의 값을 가져와야합니다. 이는 관용적 인 ASP.NET 고전이 아닙니다. 대부분의 웹 양식 개발자가 POST 데이터에서 직접가 아니라 웹 컨트롤에서 직접 값을 가져 오는 것에 익숙하기 때문에 과도하게 혼란 스러울 수 있습니다.
발표자가 페이지 수명주기를 인식해야하는 이유에 대해 아직 명확하지 않습니다. 발표자가보기에만 컬렉션을 제공하지 않습니까? 보기에서 서버 컨트롤을 만들고 렌더링하지 않습니까? – BlackICE