집 >백엔드 개발 >C#.Net 튜토리얼 >ASP.net에서 컨트롤을 동적으로 로드할 때 발생하는 몇 가지 문제 요약
ASP.net에서 동적 컨트롤을 사용하지 말라고 하는 사람들을 자주 봅니다. 동적 컨트롤을 사용하면 문제가 발생할 수 있기 때문이라고 생각합니다. 프로젝트 작업 과정에서 동적으로 로드된 컨트롤로 인해 항상 실수가 발생합니다. . 간략한 요약은 다음과 같습니다.
1. LoadControl을 사용하여 컨트롤을 로드한 후 사용자 컨트롤의 일부 컨트롤이 더 이상 이벤트에 응답하지 않습니다.
이 문제는 주로 if(!Page.IsPostBack) 내부에 컨트롤 로딩을 배치하여 발생하며, 그냥 외부에 배치하면 됩니다. 이 문제는 Sigui의 블로그에 자세히 설명되어 있습니다.
2. 사용자 컨트롤의 일부 컨트롤에 문제가 있습니다. 예를 들어 버튼을 처음 선택하면 CLICK 이벤트가 발생하지 않지만 두 번째에는 OK가 발생합니다.
컨트롤에 ID를 설정하지 않아서 발생하는 현상입니다. 컨트롤 ID의 기능은 아래에서 자세히 설명합니다.
Control userControl=(Control)Page.LoadControl(“Test.ascx”);
userControl.ID="Test";
AddControl(userControl);
과 같은 경우 3. 사용자 컨트롤이 DataGrid 컨트롤이 포함되어 있으면 컨트롤을 로드한 후 DataGrid 이벤트에 응답하지 않는 문제가 발생할 수 있습니다.
이것은 버그인 것 같습니다. 로드된 컨트롤을 다음과 같이 강제로 변환해야 합니다.
Test userControl=(Test)Page.LoadControl("Test.ascx")
참고: 위의 내용은 Control이 아닌 Test 방식을 사용했습니다!
이 문제는 이전 블로그에서 언급한 바 있습니다. 이 방법을 사용하면 시스템의 확장성이 저하됩니다. 여러분과 논의할 솔루션이 있습니다(전략 패턴 사용):
public class BaseControl : System.Web.UI.UserControl
{
public virtualBaseControl ProcessThisControl();
}
모든 사용자 컨트롤은 BaseControl에서 상속됩니다. Datagrid 컨트롤이 있는 경우 다음과 같이 재정의된 ProcessThisControl 메서드가 사용됩니다.
이를 Test로 반환
다음과 같이 컨트롤을 로드합니다.
BaseControl userControl=(BaseControl )Page.LoadControl("Test.ascx");
userControl.ProcessThisControl();
4. 사용자 컨트롤에서 JavaScript를 사용하는 방법.
클라이언트측 스크립트를 사용하면 페이지 응답 속도가 크게 향상되고 페이지가 자주 새로 고쳐지는 것을 방지할 수 있다는 것은 누구나 알고 있습니다. 따라서 JavaScript를 사용하여 페이지의 부분 제어를 구현하는 것이 더 좋은 방법이지만 사용자 컨트롤의 특정 하위 컨트롤에 액세스하면 어떻게 될까요?
다음과 같이 사용됩니다: document.all.<%= TestControl.ClientID%>.disabled=true; //TestControl을 비활성화하도록 설정
C# 스크립트로 작성하는 경우: Page.RegisterStartupScript("OnInitControl","") // 테스트 은 사용자 컨트롤이고 TestControl은 사용자 컨트롤의 하위 컨트롤입니다.
이제 컨트롤 ID에 대해 이야기해 보겠습니다. aspx 파일에 액세스하면 IIS가 aspx 스크립트를 컴파일합니다. 컴파일할 때 동일한 페이지의 사용자 컨트롤에 콘텐츠를 작성합니다. 페이지의 컨트롤이 사용자 컨트롤의 컨트롤과 동일한 이름을 갖지 않도록 하려면 사용자 컨트롤의 컨트롤 이름을 다음과 같이 변경합니다. : 하위 컨트롤의 경우 컨트롤 ID가 사용자 컨트롤 ID_자식 컨트롤 ID로 변경됩니다. 컨트롤을 동적으로 로드할 때 컨트롤의 ID가 할당되지 않으면 컨트롤 ID는 마지막으로 로드된 컨트롤의 컨트롤 ID가 되므로 사용자 컨트롤이 로드된 후 즉시 ID를 설정해야 합니다.