2010-06-07 2 views
2

웹 사이트 프로젝트가 있고 그 안에 사용자 웹 컨트롤이 ascx 파일로 정의되어 있습니다.웹 컨트롤이 .master 컨트롤 형식으로 추가되었습니다. 하위 페이지에 없습니다.

컨트롤이 Site.Master에 추가되어 페이지에 올바르게 표시되고 모든 것이 정상입니다.

Site.Master에서 파생 된 페이지 중 하나에서 컨트롤의 필드 중 일부를 재정의해야합니다.

// In OnLoad: 
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID")); 

문제는 MyControlName이 하위 페이지에 유효한 유형으로 등록되지 않는다는 것입니다. 컨트롤의 두 번째 인스턴스를 직접 자식 페이지에 추가하면 위의 코드는 필요한대로 작동하지만 컨트롤이 페이지에 직접 배치되지 않고 대신 마스터 페이지에만 정의되어 있으면 형식이 정의되지 않습니다. 컨트롤은 네임 스페이스에 없으며 프로젝트 내에 정의되어 있으므로 왜 그런 문제 위치에 적절한 유형이 있는지 알 수 없습니다.

OnLoad에 중단 점을 넣으면 컨트롤에 대해 나열된 형식이 ASP.my_control_name_ascx이지만이를 사용하면 작동하지 않습니다.

왜 하위 클래스가 올바른 유형을 참조 할 수 없습니까? 이 문제를 해결할 수 있습니까?

감사합니다.

답변

0

GetBaseMasterPage()는 독자적인 방법입니까? 시도하면 어떻게됩니까?

MyControlName control = (MyControlName)Page.Master.FindControl("controlId"); 

?

+0

예, 그것은 우리 자신의 기능입니다. 사이트 마스터와 섹션 마스터가 있습니다. 모든 섹션 마스터가 반드시 사이트 마스터를 상속하지는 않으므로이 기능은 '가장 높은'마스터 페이지까지만 실행됩니다. 페이지에 컨트롤의 두 번째 인스턴스가있는 경우 해당 코드가 올바르게 작동합니다. 즉, 마스터 페이지에 컨트롤을 배치하고 마스터 페이지 컨트롤의 상태를 업데이트합니다. 단, 자식 페이지에 컨트롤의 인스턴스가있는 경우에만 가능합니다. 그렇지 않으면 컴파일러에서 알 수없는 유형이라고합니다. 따라서 이것은 형식 문제가 아니라 기능 문제입니다. – turtle

+0

해당 코드 샘플에 대한 빠른 (pedantic) 지점; 형식 변환을 얻으려면 Page.Master를 대괄호로 묶어야합니다. MyControlName control = ((MyControlName) Page.Master) .FindControl ("controlId"); –

+0

왜, Page.Master는 FindControl 메서드가있는 Control에서 상속 한 MasterPage 형식의 속성입니다. FindControl 메서드의 결과 인 결과를 캐스팅하기 만하면 더 이상 대괄호로 묶을 필요가 없습니다. –

1

컨트롤 전체 프로젝트에 전역 범위가 없습니다. 컨트롤이 등록 된 페이지에서만 유형으로 선택할 수 있습니다. 그래서 당신은 자식 페이지에서 컨트롤을 등록 할 수 있습니다

<%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %> 

당신은 당신의 아이의 영문 페이지의 상단에 위와 같이 레지스터 태그를 추가해야합니다.

다른 옵션은 액세스하려는 속성이나 메서드를 노출하는 컨트롤의 인터페이스를 만들고 app_code 또는 다른 전역 적으로 액세스 할 수있는 다른 위치에 인터페이스를 배치 한 다음 컨트롤이 인터페이스를 구현하고 캐스트하도록 할 수 있습니다 인터페이스에 대한 제어

0

질문에 대한 직접적인 대답은 아니지만 @MasterType directive이 유용 할 수 있습니다. 당신이 당신의 ASPX 페이지의 상단에

<%@ MasterType TypeName="ClientName.SiteName.MasterPages.SiteMaster" %> 

같은 라인을 추가하면

, 당신은 그것을 캐스팅 할 필요없이 코드 마스터 페이지를 참조 할 수 있어야한다. 이렇게하면 코드에서 컨트롤을 쉽게 찾을 수 있습니다.

당신은 같은 라인으로 끝낼 수 :

// In Page.OnLoad: 
MyControlName control = Page.Master.MyControl; 

다음 FindControl 호출 래핑 마스터 페이지에 새 속성을 노출 :이 도움이

// In Site.master.cs 
internal MyControlName MyControl 
{ 
    get { this.FindControl("controlID"); } 
} 

희망을!

1

다음 코드는 나를 위해 작동 :

DropDownList ddlLanguage = (DropDownList)Page.Master.FindControl("ddlLanguage"); 
관련 문제