웹 사이트 프로젝트가 있고 그 안에 사용자 웹 컨트롤이 ascx 파일로 정의되어 있습니다.웹 컨트롤이 .master 컨트롤 형식으로 추가되었습니다. 하위 페이지에 없습니다.
컨트롤이 Site.Master에 추가되어 페이지에 올바르게 표시되고 모든 것이 정상입니다.
Site.Master에서 파생 된 페이지 중 하나에서 컨트롤의 필드 중 일부를 재정의해야합니다.
// In OnLoad:
MyControlName control = (MyControlName) Page.Master.GetBaseMasterPage().FindControl("controlID"));
문제는 MyControlName이 하위 페이지에 유효한 유형으로 등록되지 않는다는 것입니다. 컨트롤의 두 번째 인스턴스를 직접 자식 페이지에 추가하면 위의 코드는 필요한대로 작동하지만 컨트롤이 페이지에 직접 배치되지 않고 대신 마스터 페이지에만 정의되어 있으면 형식이 정의되지 않습니다. 컨트롤은 네임 스페이스에 없으며 프로젝트 내에 정의되어 있으므로 왜 그런 문제 위치에 적절한 유형이 있는지 알 수 없습니다.
OnLoad에 중단 점을 넣으면 컨트롤에 대해 나열된 형식이 ASP.my_control_name_ascx이지만이를 사용하면 작동하지 않습니다.
왜 하위 클래스가 올바른 유형을 참조 할 수 없습니까? 이 문제를 해결할 수 있습니까?
감사합니다.
예, 그것은 우리 자신의 기능입니다. 사이트 마스터와 섹션 마스터가 있습니다. 모든 섹션 마스터가 반드시 사이트 마스터를 상속하지는 않으므로이 기능은 '가장 높은'마스터 페이지까지만 실행됩니다. 페이지에 컨트롤의 두 번째 인스턴스가있는 경우 해당 코드가 올바르게 작동합니다. 즉, 마스터 페이지에 컨트롤을 배치하고 마스터 페이지 컨트롤의 상태를 업데이트합니다. 단, 자식 페이지에 컨트롤의 인스턴스가있는 경우에만 가능합니다. 그렇지 않으면 컴파일러에서 알 수없는 유형이라고합니다. 따라서 이것은 형식 문제가 아니라 기능 문제입니다. – turtle
해당 코드 샘플에 대한 빠른 (pedantic) 지점; 형식 변환을 얻으려면 Page.Master를 대괄호로 묶어야합니다. MyControlName control = ((MyControlName) Page.Master) .FindControl ("controlId"); –
왜, Page.Master는 FindControl 메서드가있는 Control에서 상속 한 MasterPage 형식의 속성입니다. FindControl 메서드의 결과 인 결과를 캐스팅하기 만하면 더 이상 대괄호로 묶을 필요가 없습니다. –